2014-01-29 62 views
1

我試圖使用fgets從命令行獲取用戶輸入。代碼片段是允許用戶將新節點添加到單個鏈接列表的功能的一部分。正如你從我的代碼中看到的那樣,我使用while循環來請求用戶的輸入(以便他/她可以添加多個節點)。當我運行這個程序時,第一次一切都很好。但是,當我嘗試添加第二個節點時,程序將跳過名字字段的輸入請求。在我的命令行中,我得到的第一個名字:姓:C:fgets跳過用戶輸入

while (go) 
{ 
    char first_name[256]; 
    char last_name[256]; 
    char telephone[256]; 
    char address[256]; 

    printf("First name: "); 
    fflush(stdout); 
    fgets(first_name, sizeof(first_name), stdin); 
    //scanf("%s", &first_name); 
    fflush(stdin); 

    printf("Last name: "); 
    fflush(stdout); 
    fgets(last_name, sizeof(last_name), stdin); 
    fflush(stdin); 
    //scanf("%s", &last_name); 

    printf("Address: "); 
    fflush(stdout); 
    fgets(address, sizeof(address), stdin); 
    fflush(stdin); 
    //scanf("%s", &address); 

    printf("Telephone: "); 
    fflush(stdout); 
    fgets(telephone, sizeof(telephone), stdin); 
    fflush(stdin); 
    //scanf("%s", &telephone); 

    if (!search_by_all(first_name, last_name, address, telephone)) 
    { 
     add_entry(first_name, last_name, address, telephone); 
     printf("Success adding entry! Add another entry? 1 for yes, 0 for no.\n"); 
     scanf("%d", &go); 
     fflush(stdin); 
     fflush(stdout); 
    } 
    else 
    { 
     printf("Error adding entry. Quitting...\n"); 
     break; 
    } 
} 

我已經看了看計算器和其他網站,但沖洗stdin和stdout不爲我做的伎倆類似的問題。我的緩衝區也沒有分配更多的空間。有什麼建議麼?謝謝!

+2

爲什麼'fflush(stdin)'?這不是未定義的行爲,至少在大多數平臺上? –

+0

不要使用'fflush(stdin);'如果你沒有使用微軟編譯器 –

+0

[爲什麼fgets沒有輸入第一個值?](http://stackoverflow.com/questions/20092468/why-fgets-是不是輸入的第一個值) – Barmar

回答

1

混合scanf()fgets()是有問題的。

建議全部fgets()並查看結果。

// scanf("%d", &go); 
char buf[sizeof(go)*3 + 3]; 
if (fgets(buf, sizeof buf, stdin) == NULL) Handle_EOF(); 
if (sscanf(buf, "%d", &go) != 1) Handle_BadInput; 

scanf()的典型用法離開stdin輸入'\n'。隨後致電fgets(),然後僅返回"\n"

注意:有信心的所有匹配的fflush(stdin);可能會被刪除。