使用getchar()计算C中的新行、新制表符和空格
我创建了一个统计新行、新词、词组和制表符的表。 我成功地计算了所有这些,但问题出在输出上: 我试图只打印一行,结果是我正在计数的,但输出是整个计数(增量) 期望输出:使用getchar()计算C中的新行、新制表符和空格,c,C,我创建了一个统计新行、新词、词组和制表符的表。 我成功地计算了所有这些,但问题出在输出上: 我试图只打印一行,结果是我正在计数的,但输出是整个计数(增量) 期望输出: +===============================================================+ | WORDS, NEW LINE COUNTER | +======+==========+==========+====
+===============================================================+
| WORDS, NEW LINE COUNTER |
+======+==========+==========+============+===========+=========+
| ID | NEW LINE | NEW WORD | CHAR COUNT | NEW SPACE | NEW TAB |
+===============================================================+
I am counting spaces and tab here
| 2 | 1 | 8 | 34 | 6 | 0 |
我做错了什么?输出似乎几乎正确。在我看来,潜在的问题可能是程序没有正确理解EOF
,尤其是以下语句,而((c=getchar())!=EOF)
,但我不确定原因
感谢您为解决方案指明了正确的路线。它实际上运行得很好,但您正在每次迭代中打印。 对于所需的输出,应将
printf
语句放在while块结束后
while ((c = getchar()) != EOF)
{
++nc;
if(c == '\n')
++nl;
if(c == ' ' || c == '\n' || c == '\t')
state = OUT;
if(c == ' ')
newspace++;
if(c == '\t')
tabchar++;
else if(state == OUT)
{
state = IN;
++nw;
}
id = nl + 1;
printf("| %d | %d | %d | %d | %d | %d |\n", id, nl, nw, nc, newspace, tabchar);
}
应该是:
while ((c = getchar()) != EOF)
{
++nc;
if(c == '\n')
++nl;
if(c == ' ' || c == '\n' || c == '\t')
state = OUT;
if(c == ' ')
newspace++;
if(c == '\t')
tabchar++;
else if(state == OUT)
{
state = IN;
++nw;
}
id = nl + 1;
}
printf("| %d | %d | %d | %d | %d | %d |\n", id, nl, nw, nc, newspace, tabchar);
它实际上工作得很好,但每次迭代都要打印。 对于所需的输出,应将
printf
语句放在while块结束后
while ((c = getchar()) != EOF)
{
++nc;
if(c == '\n')
++nl;
if(c == ' ' || c == '\n' || c == '\t')
state = OUT;
if(c == ' ')
newspace++;
if(c == '\t')
tabchar++;
else if(state == OUT)
{
state = IN;
++nw;
}
id = nl + 1;
printf("| %d | %d | %d | %d | %d | %d |\n", id, nl, nw, nc, newspace, tabchar);
}
应该是:
while ((c = getchar()) != EOF)
{
++nc;
if(c == '\n')
++nl;
if(c == ' ' || c == '\n' || c == '\t')
state = OUT;
if(c == ' ')
newspace++;
if(c == '\t')
tabchar++;
else if(state == OUT)
{
state = IN;
++nw;
}
id = nl + 1;
}
printf("| %d | %d | %d | %d | %d | %d |\n", id, nl, nw, nc, newspace, tabchar);
阅读你的代码,在脑海中或纸上一行一行地浏览。然后你就会明白为什么你的代码要打印很多次。您好,是的,
printf
应该在外面,正如我在一段时间后意识到的,正如用户指出的那样。然而,它仍然不起作用。在我移动printf
后,请看这里,阅读您的代码,并在脑海中或纸上逐行阅读。然后你就会明白为什么你的代码要打印很多次。您好,是的,printf
应该在外面,正如我在一段时间后意识到的,正如用户指出的那样。然而,它仍然不起作用。在我移动了printf
之后,请看这里,您好,谢谢阅读。我试过了,但它什么也印不出来!。我认为您的解决方案会起作用,因为我意识到printf
语句应该在循环之外。但为什么不工作?它似乎没有正确理解EOF?但我不确定发生了什么。如果你使用的是输入文件,它应该结束。如果你在控制台上写东西,你应该使用Ctrl+D发送一个EOF字符。明白了!谢谢,这很有效!不知道EOF的Ctrl+D!您好,谢谢您的阅读。我试过了,但它什么也印不出来!。我认为您的解决方案会起作用,因为我意识到printf
语句应该在循环之外。但为什么不工作?它似乎没有正确理解EOF?但我不确定发生了什么。如果你使用的是输入文件,它应该结束。如果你在控制台上写东西,你应该使用Ctrl+D发送一个EOF字符。明白了!谢谢,这很有效!不知道EOF的Ctrl+D!