2
#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。

4

3 回答 3

6

第一次调用 getchar() 在输入缓冲区中留下一个换行符。下一个调用gets()将换行视为输入的结尾,因此不会等待您输入。

使用另一个 getchar() 使用换行符。

 ...
 letter=getchar();
 getchar(); // To consume a newline char left
 printf("%c",letter);
 fgets(str, sizeof str, stdin);

注意: gets()是危险的,因为它容易受到缓冲区溢出的影响。所以使用fgets()代替。

于 2013-04-30T12:40:14.860 回答
2

正如上面回答的那样,当您从 statndard 输入读取字符时,您点击的输入被放置gets()在您的情况下被读取的标准输入缓冲区中。这就是为什么gets()不等待输入。

您可以fflush(stdin)在读取字符后使用清除输入缓冲区。

于 2013-04-30T13:23:25.630 回答
1

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()

于 2013-04-30T12:47:14.760 回答