2013-04-30 27 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)在讀取字符後清除輸入緩衝區。