2011-08-23 80 views
4

當我運行下面的代碼時,它按預期工作。爲什麼我的scanf語句中的空格有所作爲?

#include <stdio.h> 
int main() 
{ 
    char c; 
    scanf("%c",&c); 
    printf("%c\n",c); 

    scanf(" %c",&c); 
    printf("%c\n",c); 

    return 0; 
} 

如果刪除在第二scanf呼叫(scanf("%c",&c);)的空間,程序與第二scanf的掃描'\n',並輸出相同的不良的行爲表現。

爲什麼會發生這種情況?

+1

搜索和閱讀scanf和格式化字符 - 即說,空間正在吃你的回車從第一個輸入,這就是爲什麼你有你做的結果。 – KevinDTimm

回答

3

這是因爲當你輸入你的角色進行第一次scanf調用時,除了輸入角色本身外,你還按下了「Enter」(或「Return」)。 「Enter」按鍵向標準輸入發送'\ n',這是您的第二次scanf呼叫掃描的內容。

因此,第二個scanf只是獲取輸入流中的下一個字符,並將其分配給您的變量(即,如果您不使用此scanf語句中的空間)。因此,舉例來說,如果你沒有在你的第二個scanf的使用空間和

你這樣做:

a<enter> 
b<enter> 

第一scanf函數分配「a」和第二scanf函數分配「\ n」。

但是,當你這樣做:

ab<enter> 

猜猜會發生什麼?第一個scanf將分配「a」,第二個scanf將分配「b」(而不是「\ n」)。

另一種解決方案是使用scanf("%c\n", &c);作爲您的第一個scanf語句。

+0

謝謝Chaitanya,這有幫助。 – n0nChun

0

將您的第一次掃描轉換爲:scanf("%c\n",&c);,這樣它也可以獲得回報。

+0

'\ n'也會選取任何其他空格字符。格式字符串中的任何空格(包括'\ n'')都會告訴'scanf'讀取零個或多個空格字符。 –

+1

@Keith這正是他的第二個scanf正在做的事情,它是「忽略」所有空格並讀取c中的第一個非空白字符。我之所以選擇\ n,是因爲它更容易理解它正在做什麼。 –

4

當你想讀一個char放棄新行字符和空格,使用

scanf("\n%c",&c); 

它的工作原理就像一個魅力。

相關問題