2013-04-30 61 views
1
#include<stdio.h> 
void main(){ 
    char str[100]; 
    char letter; 
    letter=getchar(); 
    printf("%c",letter); 
    gets(str); 
    //Rest of code 
} 

执行时,代码跳过gets(str)行。但是当我用scanf替换get时,它就可以工作。任何具体原因为什么不起作用? 我使用的是gcc 4.7.2。输入使用gets不起作用,但使用scanf

回答

4

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

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

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

注:gets()是危险的,因为它的抗缓冲区溢出漏洞。因此改用fgets()

+0

那么有什么办法可以让get()忽略换行符......或者也许从缓冲区中删除换行符。 PS:我尝试过使用fflush,但后来也面临同样的问题 – psyc0der 2013-04-30 12:45:04

+0

您可以再次使用getchar()来使用它。我更新了我的答案。 fflush(stdin)仅适用于MSVS,在其他编译器/平台上它是未定义的行为。 – 2013-04-30 12:47:30

+0

谢谢了。这很清楚 – psyc0der 2013-04-30 12:52:38

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

2

当你从statndard中读取一个字符时,如上面的回答输入你在这个被放置在stdin缓冲区后输入的回车,在你的情况下通过gets()读取。这就是为什么gets()不在等待输入。

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