2013-02-08 64 views
2


我提示用戶輸入一個數組的長度,用這個輸入初始化一個char []數組,然後提示用戶鍵入一個消息進入char []數組。

我正在用getchar()正在讀取用戶消息的第一個字符。

但是,在讀取任何用戶輸入之前,getchar()正在讀取新行轉義'\n'。它似乎越來越'\n'從以前printf聲明,提示用戶...


下面是相關代碼:爲什麼在printf語句後getchar()讀取' n'?

#include <stdio.h> 

int main(void) { 

    int len = 0, 
     originalLen = 0; 

    printf("\n\nWhat is the length of the array? "); 
    scanf("%d", &originalLen); 
    char str[originalLen]; // intitializing the array 

    printf("Enter a message to enter into the array: "); 
    char target = getchar(); 
    str[len] = target; 

    // why is getchar() reading '\n'? 
    if (target == '\n') { 
     printf("\n...what happened?\n"); 
    } 
    return 0; 
} // end of main 


回答

2

當你輸入號碼,然後按Enter鍵,數字和字符被放置在輸入緩衝區中,他們分別是:

  • 輸入的編號和
  • 換行符(\n)。

數得到由scanf消耗,而是換行保持在輸入緩衝器,其通過getchar()讀取。

您需要使用調用getchar()之前消耗\n

scanf("%d ", &originalLen); 
     ^^^ 

這告訴scanf閱讀次數和額外的性格,這是\n

+0

啊謝謝@Alok,這很有道理 - 它擊中了添加「\ n」字符的ENTER鍵。因爲這個原因'scanf'皺起了眉頭? –

+1

@IanCampbell:對,還有更多。如:*類型安全,輸入驗證等*。在閱讀字符和字符串時應該避免使用它,但可以將它用於簡單的數字輸入。 –

+0

感謝@Alok,有趣......所以對於字符和字符串,scanf是更好的選擇? –

4

這是因爲以前scanf在數字後面閱讀換行符。

這是可以解決的方法有兩種:

  1. 使用例如getchar讀它
  2. 添加一個空格scanf格式後(如scanf("%d ", ...)
+0

感謝@Joachim,所以你似乎必須使用'scanf'的額外空間hack ...有沒有更好的選擇,還是這個專業接受? –

+1

@IanCampbell我不會稱之爲「黑客」,它只是告訴'scanf'讀取(並放棄)空白。至於「專業接受」,我自己使用了很多,並且在很多其他代碼中也看到了它,所以這種情況並不罕見。 –

+0

好的建議,謝謝@Joachim。 –

3

您可以在循環中使用getchar來清除stdin,然後再讀取下一個字符。

while((target = getchar()) != '\n' && target != EOF) 
相關問題