c - 为什么在使用 getchar() 的 while 循环中移动 printf() 会产生不同的结果?

标签 c

我是 C 的新手,如果这个问题很基础,我很抱歉。我试图了解 getchar() 函数的行为。

这里我有两个版本的代码:

第一个:

#include <stdio.h>

int main()
{
    int c = getchar();
    while (c != EOF)
    {
        putchar(c);
        c = getchar();
        printf(" hello\n");
    }
}

当我输入 12 并按下返回键时,它会产生:

12
1 hello
2 hello

然后是另一个,我将 printf() 向上移动,输入相同的输入

#include <stdio.h>

int main()
{
    int c = getchar();
    while (c != EOF)
    {
        putchar(c);
        printf(" hello\n");
        c = getchar();
    }
}

它产生:

12
1 hello
2 hello

 hello

为什么这两个代码的工作方式不同,为什么第二个代码的末尾会出现额外的问候语。

最佳答案

请注意,您提供了 3 个字符的输入 - '1'、'2' 和一个换行符 (\n)。 鉴于此,让我们跟踪您的程序在做什么:

第一个片段:

Read '1' -> 
Print '1' -> 
Read '2' -> 
Print "hello\n" -> 
Print '2' -> 
Read '\n' -> 
Print "hello\n" -> 
Print '\n' -> 
wait for more input

所以最后打印的是换行符。

第二个片段:

Read '1' -> 
Print '1' ->  
Print "hello\n" -> 
Read '2' -> 
Print '2' -> 
Print "hello\n" -> 
Read '\n' -> 
Print '\n' -> 
Print "hello\n" -> 
wait for more input.

所以它首先打印换行符,然后打印"hello"

简而言之,两个片段执行相同次数的迭代,但在第一个片段中,最后一个 printf("hello\n")getchar 阻塞,当没有更多的输入。第二个片段不是这种情况。

关于c - 为什么在使用 getchar() 的 while 循环中移动 printf() 会产生不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54487946/

相关文章:

c - 使用 c 编写动态数组时,不同版本的 gcc 的输出不同

c - 在 C 中使用 "multidimensional" "dynamic arrays"

c++ - 将 C 组件集成到 C++ 框架中的最佳实践是什么?

java - 找出 n*n 棋盘上两个皇后相交(不稳定)的方式数?

javascript - OPC 服务器到 MySQL 数据库

C编程: Protected memory across fork()

c - Frama-c 镁 : Unable to execute WP plugin on Windows

c - VALGRIND MALLOC 和寻找邪恶段错误的探索

c - EXIT_FAILURE 与退出(1)?

c - 使用 gethostbyname() 查找 IP