输入使用不起作用,但使用scanf

时间:2013-04-30 12:38:05

标签: c gcc input stdin

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

3 个答案:

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