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