我开始学习C和我的一个朋友(比我大),The C Programming Language由Brian Kernighan和Dennis 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 确实.
谢谢你的帮忙.
这个对我有用.
$ 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 .