2012-04-22 43 views
1

對於以下的代碼:(假定x已經被定義)當格式字符串以換行符結尾時,scanf的行爲是什麼?

scanf("%d\n", &x); 
printf("foo"); 

我期望程序打印FOO如果我按1和ENTER鍵,但這種情況並非如此。 我必須按1,ENTER,2,ENTER才能看到它打印foo。

現在的問題是爲什麼我需要輸入一些東西加上另一個ENTER使scanf返回?這不可能是scanf只需要比格式字符串多一個回答,因爲按1,ENTER,ENTER也不起作用。事實上,無論我輸入多少回車鍵,scanf都會一直等待,直到我輸入其他內容。

我已經在Visual Studio 2010和MinGW中嘗試過這個例子,並且他們產生了相同的結果。那麼如何解釋呢?這是Windows特有的嗎?或編譯器依賴?或者只是這種使用scanf產生未定義的行爲?

回答

4

scanf格式字符串中的'\n'(以及空格,標籤,'\r','\f'和)使scanf忽略空白。

ENTER是空格,所以scanf會盡可能多地忽略它,只有當它看到不是空格的東西時纔會停止(2)。

+1

POSIX表示它是這樣的:「由一個或多個空格字符組成的指令應該通過讀輸入來執行,直到不能再讀取有效的輸入爲止,或者直到不是空白字符的第一個字節,它仍然是未讀的。「 (http://pubs.opengroup.org/onlinepubs/007904975/functions/scanf.html) – Mat 2012-04-22 15:30:13

+1

@pmg謝謝。所以根據\ n的描述,格式字符串中的\ n並不一定意味着用戶必須使用\ n作爲輸入。所有被視爲空白的東西都會與\ n匹配,對嗎? – weidi 2012-04-22 15:43:52

+1

這是正確的。同樣,許多轉換規範通過忽略主要空白字符來工作:例如'「%d」'和'「%d」'相同'\ n%d「'與\」\ n \ r \ v \ n \ n \ n%d「'並匹配'42'或' 42' – pmg 2012-04-22 15:46:20

相關問題