C编程语言书示例:可能过时了?
我开始学习C语言,我的一个朋友(比我大)建议C编程语言书示例:可能过时了?,c,C,我开始学习C语言,我的一个朋友(比我大)建议使用C编程语言,作者是Brian Kernighan和Dennis Ritchie 然而,在尝试一些示例时,它们的行为与预期不同,并且与书中所写的不同 例如,这个似乎不起作用(不打印): #包括 #在1中定义 #定义出0 /*计算输入中的行、字和字符数*/ int main() { 北卡罗来纳州、北卡罗来纳州、北卡罗来纳州、北卡罗来纳州; 状态=输出; nl=nw=nc=0; 而((c=getchar())!=EOF){ ++数控; 如果(c=='\n
使用C编程语言,作者是Brian Kernighan和Dennis Ritchie
然而,在尝试一些示例时,它们的行为与预期不同,并且与书中所写的不同
例如,这个似乎不起作用(不打印):
#包括
#在1中定义
#定义出0
/*计算输入中的行、字和字符数*/
int main()
{
北卡罗来纳州、北卡罗来纳州、北卡罗来纳州、北卡罗来纳州;
状态=输出;
nl=nw=nc=0;
而((c=getchar())!=EOF){
++数控;
如果(c=='\n')
++nl;
如果(c=''| | c='\n'| | c='\t')
状态=输出;
else if(state==OUT){
状态=IN;
++西北;
}
}
printf(“%d%d%d\n”,nl,nw,nc);
返回0;
}
你认为我应该继续读这本书吗?也许只有一些错误,值得一读?或者有一本更适合C初学者的书
编辑:我的假设是,使用ENTER
键发送输入将模拟EOF
,而不是<代码>CTRL+Z
执行
谢谢你的帮助。该程序运行良好。请注意,它在打印任何内容之前需要一些输入;它统计输入中的行数、字数和字符数。因此,如果您将代码编译成示例
并运行:
echo this has four words | example
您将看到以下输出:
1 4 20
(这是一行,4个单词,20个字符)。对我来说效果很好。它真的不应该过时,因为语言在相当长的一段时间内没有太大的变化。互联网和书籍中的一些示例可能是特定于操作系统的。一个典型的例子是系统(“暂停”)
仅在Windows上工作,但可以转换为sentinel循环,该循环不断询问您是否要再次运行它或是否有选项菜单。我运行这个示例并点击ctrl-d,它输出了5314
。下面是我的输入。最后两行是空行
bla
blah
2
我通常通过重定向输入来运行类似的程序,例如*nix上的/a.out
它对我有效
$ gcc c.c -o c
$ echo hello world | ./c
1 2 12
$
程序从标准输入读取文本,直到到达文件末尾。我怀疑您在从键盘读取时没有正确地发出文件结束状态的信号。在Linux和其他类似Unix的系统上,单独在一行中键入Ctrl-D。在Windows上,键入Ctrl-Z
如果您从IDE启动程序,它可能会在新启动的终端窗口中运行程序,该窗口在程序完成时关闭;在这种情况下,窗口可能会在您看到输出之前消失。如果您的IDE没有提供覆盖此错误行为的方法,您可以直接从运行shell的终端窗口运行它,也可以添加一行,例如:
getchar();
到程序结束时,之前返回0代码>。这导致它在终止之前读取(并忽略)输入字符;您可以在看到输出后键入Enter。请注意,当您从shell执行程序时,这种情况可能会使运行程序更加困难,因此只有在必要时才这样做
Kernighan和Ritchie的《C编程语言》,通常被称为K&R,是一本优秀的C语言书;毕竟,里奇在很大程度上发明了这种语言,尽管它确实倾向于假定一些现有的编程知识。确保你有第二版;第一个描述了该语言的早期版本。(自K&R2发布以来,有两个新的ISO C标准,但它们没有添加任何对入门测试至关重要的内容。)
有关其他C在线教程和书籍的列表,请参阅的问题18.9和18.10。《C编程语言》是一本非常适合您的好书,相信您的朋友。
你看不到的原因是你没有结束你的输入。
在Unix中,您可以输入Ctrl+D,以结束输入。
程序还可以,我对它进行了测试。C编程语言是丹尼斯·里奇的一本好书。但是,如果您对此感到不满意,您可以使用另一本书:
让我们来看看亚什万特·卡内特卡
读完这本书后,你想看看你真正了解多少C语言(也就是说,你对它的语法和怪癖了解多少),你可以试试这个:
通过Yashwant Kanetkar测试你的C技能,所以,你的程序可能什么也不打印,但在你按下Ctrl+C或类似的键之前不会给你提示,对吧?这意味着您永远不会退出while循环,这意味着您的输入中没有EOF
这本书基于较旧的体系结构,这些体系结构可能对构成EOF的内容有不同的约定。我对这本书的建议是继续读下去,保持灵活的思维,这样你就可以解释错误并解决它们。从书本上学习是很好的,但是只有在你开始使用它并自己调试它之前,你才能真正地集成它。例如,如果我不知道这个程序中发生了什么,我可能会在while循环中放入printf,以获得有关循环行为的一些反馈。我还可以尝试将EOF更改为其他内容(可能是-1,,/)。想象一下,你是一个玩东西的小孩,你可能会学得更快。至少这是我的经验
至于其他可供学习的书籍,我强烈推荐乔恩·埃里克森的《黑客,剥削的艺术》一书。它不需要以前的编程经验,第二章是对C语言的一个非常全面的介绍。我从这本书的那一章学到了更多关于计算机如何真正工作的知识,而不是在一所私立大学的三个学期的计算机编程课程。以一种非常清晰但密集的方式,它解释了如何使用GNU调试器,编译器如何解释您编写的代码,内存如何工作(堆栈、bss等),最重要的是,它解释了如何在li中查看其他内容
getchar();
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/* count lines, words, and characters in input */
int main (void)
{
int ch;
int linefeeds_n = 0;
int words_n = 0;
int chars_n = 0;
bool new_word = true;
while ((ch = getchar()) != EOF)
{
if (ch == '\n')
{
new_word = true;
linefeeds_n++;
}
else if (ch == ' ' || ch == '\t')
{
new_word = true;
}
else if (new_word)
{
new_word = false;
words_n++;
}
chars_n++;
}
printf("%d %d %d\n",
linefeeds_n,
words_n,
chars_n);
return EXIT_SUCCESS;
}