好吧,所以我在K& R第二版做练习8。在我尝试进行练习后查找答案时,除了换行符之外没有打印任何内容(标签和空格的其他整数仍为0,尽管运行循环计数 - 我后来发现我使用了错误的字符用于空格这只是一个空白区域,但仍然忽略了正确计算'\ t',我发现了这个:
#include <stdio.h>
int main(void)
{
int blanks, tabs, newlines;
int c;
int done = 0;
int lastchar = 0;
blanks = 0;
tabs = 0;
newlines = 0;
while(done == 0)
{
c = getchar();
if(c == ' ')
++blanks;
if(c == '\t')
++tabs;
if(c == '\n')
++newlines;
if(c == EOF)
{
if(lastchar != '\n')
{
++newlines;
}
done = 1;
}
lastchar = c;
}
printf("Blanks: %d\nTabs: %d\nLines: %d\n", blanks, tabs, newlines);
return 0;
}
现在这很好用。 K&amp; R很有意思,因为它使用了在实际文本中没有教给你的想法,例如我试图用这个方式运行我的“while”循环和多个IF,除了我的WHILE循环只在getchar运行时运行! = EOF。我想知道为什么它不起作用。
我发现他们所做的是一个更好的主意,创建int完成然后在程序结束时将它指定为1而不是0是一个更好的主意,但我仍然运行得有点正确。 (对不起,我这次没有自己的原始代码。)
我难倒的地方是main(void)的目的是什么,返回0;?在开始本书之前,我发现了对此的批评,但读者声称它只是在第1版。在这里,我发现第2版并没有教导它,而是将其放入解决方案文本中。
另外,int“lastchar”的目的是什么?如果getchar(c)是输入并且lastchar总是被定义为0,那么如何通过任何输入改变lastchar,使其对程序有意义,通过运行循环来计算换行符?我看到lastchar在程序结束时被定义为'c',但是这与之前调用它有什么关系呢?
很抱歉,如果我的任何问题都很复杂。请尽可能回答,如果您需要进一步澄清,请告诉我。重申我很好奇为什么程序不能使用getchar(c)!= EOF运行while循环,使用相同的IF语句。而不是使用while = = 0.我感觉好像它可能会更短/更简洁(绝对不能说更简单)。
答案 0 :(得分:2)
我难倒的地方是main(void)的目的是什么,返回0;?
在标准C程序中,main(0)
应返回int
,0
表示程序成功完成。有人可能认为main应该有两个参数 - 命令行参数计数和参数数组,但是如果你的程序没有使用参数那么它就没有必要。
此外,int&#34; lastchar&#34;?
的目的是什么?
在while循环结束时,程序会在lastchar
变量中存储当前字符的副本。正如您在EOF
- 处理代码中所看到的,它在确定输入文本是否以部分行结束时使用lastchar
。
我很好奇为什么程序不能使用getchar(c)!= EOF运行while循环,使用相同的IF语句。
您可以通过这种方式对其进行编码,但对于那些对C:while ((c = getchar()) != EOF)
没有多少经验的人来说,有条件的情况可能会让人感到困惑。您还必须将if (lastchar != '\n') ++newlines;
移到while循环之外。
也许您应该对程序进行更改并将其输出与原始数据进行比较以获得各种类型的输入(空文件,以换行符结尾的文件,不以换行符结尾的文件)。两个程序都显示相同的输出吗?如果没有,为什么?修改后的版本是否仍然更简洁?哪个将来更容易做出改变?
许多决定都会选择如何构建程序。甚至像这个K&amp; R例子那样简单。