输入使用不起作用,但使用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()