为什么C编程语言书中的一些代码示例不能按预期工作?
我正在努力学习C语言,我正在阅读和测试很多关于C语言的知识,但有时很难理解为什么有些东西不能像预期的那样工作。为什么C编程语言第18页第二版Kernighan和Ritchie上的示例代码不起作用?这对我来说没有任何结果为什么C编程语言书中的一些代码示例不能按预期工作?,c,C,我正在努力学习C语言,我正在阅读和测试很多关于C语言的知识,但有时很难理解为什么有些东西不能像预期的那样工作。为什么C编程语言第18页第二版Kernighan和Ritchie上的示例代码不起作用?这对我来说没有任何结果 #include <stdio.h> main() { long nc; nc = 0; while (getchar() != EOF) ++nc; printf ("%ld\n", nc); } 它没有显示任何内容
#include <stdio.h>
main()
{
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf ("%ld\n", nc);
}
它没有显示任何内容,因为它正在等待输入 如果像./u可执行文件那样运行,它将始终读取您的输入,因为getchar。它只会在输入流结束后显示结果 您可以按Control+D手动将其切断。或使用文件内容作为输入:
./the_executable < test_file.txt
它确实应该如预期的那样起作用 之所以将其与不工作混淆,是因为您希望printf为您的nc值打印一些内容,但关键是printf之前还有另一条语句getchar,它在while循环的帮助下读取标准输入,直到您输入EOF,EOF由unix中的^D control+D输入,就像在*nix上使用cat命令,或者通过使用C编程语言将输入从文件重定向到程序一样,Brian Kernighan和Dennis Ritchie的第二版是一本非常好的书,但它非常古老,引用了C语言的过时定义。您发布的程序对main使用了过时的语法。应修改为: 包括 int main{ 长nc; nc=0; 而getchar!=EOF ++数控; printf%ld\n,nc; 返回0; } 正如您所看到的,差异是最小的,在这个特定的情况下,上面的版本也将使用本书编写时使用的前ansi编译器进行编译 程序从标准输入中读取字节,并计算在到达文件末尾之前可以读取的字节数 在linux和OS/X等unix系统上按Ctrl和D键,或在Microsoft系统上按Ctrl和Z键,然后按Enter键,可以从终端窗口运行此程序,键入一些数据并发出文件结束的信号 您还可以重定向文件中的输入,并将获得该文件中的字节数,在Microsoft系统上可能会由于行结束转换而进行调整
直接从IDE运行程序并不具有说明性,因为当程序退出时,IDE通常不会保持终端窗口打开,从而阻止用户看到最终输出。您是如何使用该程序的?该程序从标准输入读取,因此您需要给它一些可读的内容,像a.out
./a.out < someFile.txt