0

私は C に不慣れで、サンプルフォーム K&R C (セクション 1.9) が正しく機能しないという問題に遭遇しました。これは私が例からコピーしたコードで、矛盾を探して一度調べました:

#include <stdio.h>
#define MAXLINE 1000

int mygetline(char line[], int maxline);
void copy(char to[], char from[]);

// print longest input line

main() {
    int len;
    int max;
    char line[MAXLINE];
    char longest[MAXLINE];

    max = 0;
    while ((len = mygetline(line, MAXLINE)) > 0)
        if (len > max) {
            max = len;
            copy(longest, line);
        }
    if (max > 0) // there was a line
        printf("%s", longest);
    return 0;
}

// getline: read a line into s, return length
int mygetline(char s[], int lim) {
    int c, i;

    for (i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
        s[i] = c;
    if (c == '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
}

// copy: copy 'from' onto 'to'; assume to is big enough
void copy(char to[], char from[]) {
    int i;

    i = 0;
    while ((to[i] = from[i]) != "\0")
        ++i;
}

コンパイルすると、次のようになります。

cc -Wall -g test.c -o test
test.c:9:1: warning: return type defaults to ‘int’ [-Wreturn-type]
test.c: In function ‘copy’:
test.c:45:30: warning: comparison between pointer and integer [enabled by default]
test.c:45:30: warning: comparison with string literal results in unspecified behavior [-Waddress]

プログラムを実行すると、次のようになります。

j

on@jon-G31M-ES2L:~/c$ ./test
Hello, does this work?
Segmentation fault (core dumped)

コンパイラとして gcc を使用しています。

4

3 に答える 3

7

コピー機能で変更"\0"します。'\0'「\0」は文字列です。文字が必要です。

于 2012-05-24T15:32:44.580 に答える
2

(コンパイラの警告で示唆されているように)代わりにcopy、関数にタイプミスがあります。条件が発生する可能性は低い"\0"'\0'

于 2012-05-24T15:34:11.700 に答える
1

問題は以下の行にあります:

while ((to[i] = from[i]) != "\0") 

そのはず

while ((to[i] = from[i]) != '\0') 

さて、なぜ最初のものが間違っていたのかについて。「\0」は実際には何らかのメモリに格納されている文字列リテラルです(たとえば、アドレスが0x7d5678であるとします)が、!=の左側は整数です。コンパイラは、そのような比較が間違っていることを自動的に認識し、パスできないため、警告が表示されます

warning: comparison between pointer and integer [enabled by default]

また、コードに文字列リテラルがある場合、どのアドレスに格納されるかを制御できないため、コンパイラは文字列リテラルとの比較が間違っていることを再度認識し、警告にフラグを立てます。

warning: comparison between pointer and integer [enabled by default]

また、補足として、Cの文字列は、文字列関数のstrcmpまたはstrncmpグループを使用してのみ比較および操作できることを常に覚えておいてください。文字列に対して「=」の比較を行うことはできません。これが理解に役立つことを願っています。

于 2012-05-24T16:09:21.577 に答える