使用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!