为什么来自 K&R 的某些代码在 Code:Blocks 中不起作用?

Why is some code from K&R not working in Code:Blocks?

当我准确输入时,K&R 中的某些示例在 Code:Blocks 中不起作用。 例如这个程序:

#include <stdio.h>
main()
{
    long nc;
    nc = 0;
    while (getchar() != EOF)
        ++nc;
    printf("%ld\n", nc);
}

当我键入此代码并 运行 它时,程序在我按 enter 时冻结或不执行任何操作。

下面的程序做同样的事情(计算字符串中的字符数)并且有效。

#include <stdio.h>
int main()
{
    char s[1000];
    int i;
    scanf("%s",s);
    for(i=0; s[i]!='[=12=]'; ++i);
    printf("Length of string: %d",i);
    return 0;
}

我是不是漏掉了什么?自 K&R 第 2 版以来是否更改了 C 还是我做错了什么?

当您按下回车键时,您将 \n 发送到标准输入流(并将其他数据刷新到 stdin,如果有的话)。这个字符(\n)与EOF相同。要发送 EOF,请按以下组合键:

  • CTRL Z然后在Windows.[=30中输入 =]
  • CTRL D 在 Unix/Linux/OSX

自那本书编写以来,C 已更改,但即使在任何版本的标准下,代码仍然不是 well-defined/valid C。

如果你使用当前的C标准(C11),或者以前的(C99)编译,一个严格符合标准的编译器(比如gcc -std=c11 -pedantic-errors)会报错:main must return int .在 C99 中删除了旧的 "implicit int" 功能。

如果使用旧的 C90 标准进行编译,代码会调用未定义的行为,因为没有 return 语句。这在 C90 中是允许的,但它不安全,它可能导致程序崩溃等。调用未定义的行为始终是一个错误,因此是非常糟糕的做法。

(在 C99 中,return 函数必须有一个 return 语句,但 main() 除外,其中 return 可以安全地省略。所以你可以如果编译为 C99,则省略 main() 的 return 语句。)

只需像您已经完成的那样更正代码,它将在任何版本的标准中编译,而不会调用未定义的行为。