C语言 使用for循环和EOF的程序给出了不正确的字符计数[关闭]

7cwmlq89  于 2023-05-28  发布在  其他
关注(0)|答案(2)|浏览(130)

**已关闭。**此问题为not reproducible or was caused by typos。目前不接受答复。

此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
昨天关门了。
Improve this question
(固定)
我最初的问题(在提出问题时犯了一些错误)-

#include <stdio.h>

int main()
{   
    for (double nc = 0; getchar() != EOF; ++nc)
    printf("%0.f", nc);
    return 0;
}

如果我给予输入“a”(不包括引号),我得到01作为输出,输入:“ab”,输出:012输入:回车键,输出:0
为什么会这样?不应该\n给予输出1,因为在我的设备中EOF值是-1和ascii新行字符值是10,我使用VS代码和Mac M1,FYI,即使在在线编译器中也有相同的输出。
我想问的问题写错了
这是K&R的原始代码:

#include <stdio.h>

int main()
{   
    double nc;
    for (nc = 0; getchar() != EOF; ++nc)
        ;
    printf("%0.f", nc);
    return 0;
}

**我在分号上犯了一个错误,并假设对于空的for循环,我们不需要分号,并且我在循环中声明了double,这不是ANSI标准,它扰乱了问题求解器的解释,对此表示抱歉。

bt1cpqcv

bt1cpqcv1#

你正在循环一个从0开始的变量,你总是在循环的每次迭代中递增它,直到EOF
因此,您的输出将如下所示
电话:012345678910
如果你只想在EOL之前得到字符数,那么你可以这样做:

#include <stdio.h>

int main()
{   
    double nc = 0;
    for (nc = 0; getchar() != EOF; ++nc);
    printf("%0.f", nc);
    return 0;
}

在这种情况下,空的for循环将不包含printf,因此,在循环结束后,您将只打印结果一次。对于您的代码,for循环在每一步都调用printf,输入到目前为止的字符数。

toe95027

toe950272#

在C中,for循环的执行顺序如下:
1.计算第一个头表达式
1.计算第二个头表达式;如果为真后藤3.,否则转到6.。
1.对循环体求值
1.计算第三个头表达式

1.退出
如果你知道while循环是如何工作的,这可能会对你有所帮助:

for (A; B; C)
    BODY

类似于

A

while (B) {
    BODY

    C
}

因此,在您的代码中,当您只按enter键时,循环体运行一次(对于'\n')并打印0。当您输入a时,循环体运行两次(针对'a''\n'),因此输出为01
注意:你的代码应该看起来更像这样,使用现代C风格:

#include <stdio.h>

int main(void)
{   
    for (int nc = 0; getchar() != EOF; nc++)
        printf("%d", nc);

    return 0;
}

相关问题