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
之后打印了空行。
我有这个小程序:
#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
之后打印了空行。