2014-03-06 33 views
1

在使用scanf()之後,我浪費了太多時間來搜索爲什麼我的程序沒有執行gets(),我找到了一個解決方案在scanf()之後使用fflush(stdin)來啓用gets()來獲取字符串。程序在scanf()之後不執行gets(),甚至使用fflush(stdin)

問題是,fflush(stdin)沒有做到它所期望的:程序繼續跳過gets(),我無法在控制檯中寫入任何短語來讀取。

我的代碼是下一個:

#include <string.h> 
#include <stdio.h> 

int main(){ 
    char nombre[10]; 
    char mensaje[80]; 

    printf("Type your name:\n"); 
    scanf("%s", nombre); 

    fflush(stdin); 

    printf("Now, type a message:\n"); 
    gets(mensaje); 

    printf("3/%s:%s",nombre,mensaje); 
    return 0; 
} 
+0

請閱讀:http://stackoverflow.com/questions/2979209/using-fflushstdin(儘管與您的問題無關)。 – Mat

+0

獲取之前可能在[Scanf中的輸入重複。問題](http://stackoverflow.com/questions/2366509/input-in-c-scanf-before-gets-problem) – Mat

+0

將上一個'printf'改爲'printf(「3 /%s:%s \ n 「,nombre,mensaje);' –

回答

6

如果沖洗STD不工作,然後嘗試讀取多餘的字符和丟棄,如建議here

這將工作:

#include <string.h> 
#include <stdio.h> 

int main(){ 
    char nombre[10]; 
    char mensaje[80]; 
    char c; 

    printf("Type your name:\n"); 
    scanf("%s", nombre); 

    while((c= getchar()) != '\n' && c != EOF) 
      /* discard */ ; 

    printf("Now, type a message:\n"); 
    gets(mensaje); 

    printf("%s:%s",nombre,mensaje); 
    return 0; 
} 
+0

謝謝emsworth!它運行完美! ;) – JCoder

+1

但是,'fflush(stdin)'仍然不屬於那裏... – twalberg

+0

是的,我繼續前進並刪除它 – emsworth

0

試試這個:

scanf("%s\n", nombre); 

在空白閱讀部分時scanf函數停止。讀取直到第一個新行。所以會發生什麼是scanf在緩衝區中留下一個換行符,它立即看到並認爲它被賦予一個空行。

如果你把你的原始代碼並輸入「名稱消息」,兩行全部在一行,你可以看到這在行動 - 獲取仍然會立即返回,但它會看到第二部分。

在scanf事物中的\ n告訴它繼續前進並消費。

+0

謝謝您的回答,但這不是解決方案,因爲在輸入名稱後,按Enter鍵並保持空白,直到輸入內容並按下回車鍵,然後控制檯顯示「現在,請鍵入消息:」 – JCoder

0

嘗試的gets(stdin);代替

fflush(stdin); 
+0

它不起作用 – JCoder

+0

抱歉,錯字,我的錯誤,使用getc(stdin),而不是fflush(stdin),fflush函數不會刷新輸入流中的數據;它被用來推送在輸出流中緩衝的數據。 – Smitt

+0

謝謝你Smitt!使用getc(stdin)也可以很好地運行。對不起,我已經看到了另一個答案並接受了它,但我至少會給你一個正面的投票。 ;) – JCoder

2

兩個大,主要問題:

  1. 不要使用fflush ON輸入流;未定義輸入流上的fflush的行爲。僅僅因爲它出現在這種情況下工作並不意味着它是正確的。

  2. 永遠永遠永遠永遠永遠永遠永遠不要使用gets - 它是在C99標準過時,已經從C2011標準完全去除。它(不可能,)在您的代碼中引入一個主要的故障點。

這是不是一個好主意遵循scanf呼叫與電話gets,因爲gets不會跳過由scanf輸入流中留下任何領導換行。使用scanf來閱讀​​和mesaje

printf("Type your name:\n"); 
scanf("%9s", nombre); 

printf("Now, type a message:\n"); 
scanf("%79s", mensaje); 

它在scanf呼籲%s%[使用顯式長度說明一個不錯的主意,否則你介紹的一樣安全漏洞gets一樣。

編輯

D'哦。我是個白癡。如果您嘗試讀取包含空格的字符串,則無法使用%s轉換說明符。使用%[轉換符,而不是:

scanf("%79[^\n]", mensage); 

將讀取到下一個79個字符或換行,以先到者爲準,並保留輸入流中的換行符。

+0

我不知道爲什麼,但是如果使用「%79s」或「 %s「:scanf只獲取整個短語的第一個單詞,所以我一直使用gets()。 – JCoder

+0

@JoséMª:看我的編輯。 –

相關問題