#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。
第一次调用 getchar() 在输入缓冲区中留下一个换行符。下一个调用gets()
将换行视为输入的结尾,因此不会等待您输入。
使用另一个 getchar() 使用换行符。
...
letter=getchar();
getchar(); // To consume a newline char left
printf("%c",letter);
fgets(str, sizeof str, stdin);
注意: gets()
是危险的,因为它容易受到缓冲区溢出的影响。所以使用fgets()代替。
正如上面回答的那样,当您从 statndard 输入读取字符时,您点击的输入被放置gets()
在您的情况下被读取的标准输入缓冲区中。这就是为什么gets()
不等待输入。
您可以fflush(stdin)
在读取字符后使用清除输入缓冲区。
getchar()
在标准输入中留下一个尾随换行符'\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(除非您正在开发一个自由运行的嵌入式系统,在这种情况下这似乎不太可能)。更多信息在这里。
请注意,该gets()
函数不再是 C 语言的一部分,它在 C11 版本的标准中被删除。改为使用fgets()
。