Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C编程语言书示例:可能过时了?_C - Fatal编程技术网

C编程语言书示例:可能过时了?

C编程语言书示例:可能过时了?,c,C,我开始学习C语言,我的一个朋友(比我大)建议使用C编程语言,作者是Brian Kernighan和Dennis Ritchie 然而,在尝试一些示例时,它们的行为与预期不同,并且与书中所写的不同 例如,这个似乎不起作用(不打印): #包括 #在1中定义 #定义出0 /*计算输入中的行、字和字符数*/ int main() { 北卡罗来纳州、北卡罗来纳州、北卡罗来纳州、北卡罗来纳州; 状态=输出; nl=nw=nc=0; 而((c=getchar())!=EOF){ ++数控; 如果(c=='\n

我开始学习C语言,我的一个朋友(比我大)建议
使用C编程语言
,作者是Brian KernighanDennis 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;
}