我有一个小程序:
#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
,就会向输入流中添加换行符。所以您的程序实际上读取两个字符:a
和n
。这个换行符由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
之前的空白。此空白表示将跳过空白字符。