#include<stdio.h>
void main(){
char str[100];
char letter;
letter=getchar();
printf("%c",letter);
gets(str);
//Rest of code
}
执行时,代码会跳过gets(str)行。但是当我用scanf替换gets时,它可以工作。任何具体的原因,为什么不起作用? 我正在使用gcc 4.7.2。
答案 0 :(得分:5)
第一次调用getchar()会在输入缓冲区中留下换行符。下一个调用gets()
认为换行符为输入结束,因此不会等待您输入。
使用另一个getchar()来使用换行符。
...
letter=getchar();
getchar(); // To consume a newline char left
printf("%c",letter);
fgets(str, sizeof str, stdin);
注意: gets()
是危险的,因为它容易受到缓冲区溢出的影响。因此,请改用 fgets() 。
答案 1 :(得分:2)
如上所述,当您从标准输入中读取一个字符时,在您将其放入stdin缓冲区后,您输入的输入将被gets()
在您的情况下读取。这就是gets()
不等待输入的原因。
您可以在读取字符后使用fflush(stdin)
清除输入缓冲区。
答案 2 :(得分:1)
getchar()
在stdin中留下一个尾随换行符'\n'
。当你打电话给gets()
时,它会一直读到它遇到这样一个换行符,然后丢弃它。由于它读取的第一个字符是'\n'
,它会立即停在那里。
解决方案是进行虚拟读取以丢弃换行符:
#include <stdio.h>
int main ()
{
char str[100];
char letter;
letter=getchar();
getchar();
printf("%c",letter);
gets(str);
return 0;
}
请注意void main()
无效C(除非您正在开发一个免费运行的嵌入式系统,在这种情况下似乎不太可能)。更多信息here。
请注意gets()
函数不再是C语言的一部分,它已被标准的C11版本删除。请改用fgets()
。