Mac上的C程序出乎意料地工作



我有一个小程序:

#include <stdio.h>
int main(){
int c;
while(c != EOF){
printf("Enter charactern");
c = getchar();
printf("Character: %cn", c);
}
printf("FINn");
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

我做错了什么?

谢谢你的回答,这是输入的lf。。。。很明显:D

您正在输入两个字符,即"a"和LF。

在处理完两者之后,才会进行while测试。

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

如果您输入abc,您将看到在c之后打印空行。

对于初学者来说,您的程序有未定义的行为,因为您在while循环的条件下使用了未初始化的变量c

int c;
while(c != EOF){
//...

功能getchar还读取空白字符,例如在按下Enter键之后放置在缓冲器中的新行字符'n'

另一个问题是,在读取并输出变量c后,您正在检查它

while(c != EOF){
printf("Enter charactern");
c = getchar();
printf("Character: %cn", c);
}

应该使用scanf而不是getchar作为示例

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

请注意转换说明符%c之前的空白。此空白表示将跳过空白字符。

相关内容

  • 没有找到相关文章

最新更新