C编程语言书的例子:可能已经过时了?

Nov*_*vak 4 c

我开始学习C和我的一个朋友(比我大),The C Programming LanguageBrian KernighanDennis Ritchie建议.

然而,在尝试一些例子时,他们的行为与预期不同,而不是书中所写.

例如,这个,似乎不起作用(什么都不打印):

#include <stdio.h>

#define IN 1
#define OUT 0

/* count lines, words, and characters in input */

int main()
{
   int c, nl, nw, nc, state;
   state = OUT;
   nl = nw = nc = 0;

   while ((c = getchar()) != EOF) {
      ++nc;
      if (c == '\n')
         ++nl;
      if (c == ' ' || c == '\n' || c == '\t')
         state = OUT;
      else if (state == OUT) {
         state = IN;
         ++nw;
      }
   }
   printf("%d %d %d\n", nl, nw, nc);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

你认为我应该继续读这本书,也许只有一些错误,值得一读吗?或者有一本更好的C语言初学者书.

编辑:我的假设是使用ENTER密钥发送输入,将模拟EOF,但不是.CTRL+Z 确实.

谢谢你的帮忙.

Kei*_*son 9

这个对我有用.

$ gcc c.c -o c
$ echo hello world | ./c
1 2 12
$ 
Run Code Online (Sandbox Code Playgroud)

程序从标准输入读取文本,直到它到达文件结尾.我怀疑你从键盘上读取时没有正确发出文件结束状态的信号.在Linux和其他类Unix系统上,单独输入Ctrl-D一行.在Windows上,键入Ctrl-Z.

如果从IDE启动程序,它可能会在新启动的终端窗口中运行程序,该窗口在程序完成时关闭; 在这种情况下,窗口可能会在您看到输出之前消失.如果您的IDE没有提供覆盖此错误行为的方法,您可以直接从运行shell的终端窗口运行它,也可以添加如下行:

getchar();
Run Code Online (Sandbox Code Playgroud)

到了程序的最后,之前return 0;.这使它在终止之前读取(并忽略)输入字符; 你可以Enter在看到输出后输入.请注意,当您从shell执行它时,这种事情会使您的程序运行更加笨拙,所以只在必要时才这样做.

Kernighan和Ritchie的"C编程语言",通常被称为K&R,是一本优秀的C书.毕竟,Ritchie在很大程度上发明了这种语言,尽管它确实倾向于假设一些现有的编程知识.确保你有第二版; 第一个描述了该语言的早期版本.(自K&R2发布以来,已经有两个新的ISO C标准,但它们没有添加任何对介绍性测试至关重要的标准.)

有关其他C在线教程和书籍的列表,请参阅comp.lang.c常见问题解答的问题18.9和18.10 .