输入使用不起作用,但使用scanf
#include 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。
第一次调用getchar()会在输入缓冲区中留下换行符。 下一个调用gets()
将换行视为输入结束,因此不会等待您输入。
使用另一个getchar()来使用换行符。
... letter=getchar(); getchar(); // To consume a newline char left printf("%c",letter); fgets(str, sizeof str, stdin);
注意: gets()
是危险的,因为它容易受到缓冲区溢出的影响。 所以请改用fgets() 。
如上所述,当您从标准输入中读取一个字符时,输入后您将其置于stdin缓冲区中,在您的情况下由gets()
读取。 这就是为什么gets()
不等待输入。
您可以在读取字符后使用fflush(stdin)
清除输入缓冲区。
getchar()
在stdin中留下一个尾随换行符'\n'
。 当你调用gets()
,它会一直读到它遇到这样一个换行字符,然后丢弃它。 由于它读取的第一个字符是'\n'
,它会立即停在那里。
解决方案是进行虚拟读取以丢弃换行符:
#include int main () { char str[100]; char letter; letter=getchar(); getchar(); printf("%c",letter); gets(str); return 0; }
请注意, void main()
不是有效的C(除非您正在开发一个自由运行的嵌入式系统,在这种情况下似乎不太可能)。 更多信息在这里 。
请注意, gets()
函数不再是C语言的一部分,它已被标准的C11版本删除。 请改用fgets()
。