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 回答