Mac 上的 C 程序运行异常

C program on Mac works unexpected

我有这个小程序:

#include <stdio.h>

int main(){
    int c;
    while(c != EOF){
        printf("Enter character\n");
        c = getchar();
        printf("Character: %c\n", c);
    }
    printf("FIN\n");
    return 0;
}

终端的输出看起来很奇怪,因为 while 循环在输入一个字符后执行了两次:

Enter character
a
Character: a                //This should be the last output after a char was entered, but the loop gets executed a second time without waiting for a keyboard-input:
Enter character
Character: 

Enter character

 

在我正在编译的终端中 运行 代码如下:

gcc main.c
./a.out

我做错了什么?

感谢解答,就是enter输入的lf....很明显:D

您正在输入 2 个字符,'a' 和一个 LF。

while 测试只有在两个都处理完后才会进行。

对于初学者来说,您的程序有未定义的行为,因为您在 while 循环

的条件下使用了未初始化的变量 c
int c;
while(c != EOF){
//...

函数 getchar 也读取白色 space 字符,例如按回车键后放入缓冲区的换行符 '\n'

另一个问题是你在读取并输出后检查变量c

while(c != EOF){
    printf("Enter character\n");
    c = getchar();
    printf("Character: %c\n", c);
}

您应该使用 scanf 而不是 getchar,例如

char c;

while ( scanf( " %c", &c ) == 1 )
{
    //...
}

注意转换说明符前的空格%c。此空白表示将跳过白色 space 个字符。

只要您按下 enter,一个换行符就会添加到输入流中。所以你的程序实际上读取了两个字符:a\n。这个换行符由 getchar() 读取并在第二次迭代中分配给 c,您实际上可以看到它被打印为一个空行。在打印 c 之前,您可以使用 break 语句来跳出循环:if (c == '\n') break;

如果你输入abc,你会看到在c之后打印了空行。