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產生未定義的行爲?
POSIX表示它是這樣的:「由一個或多個空格字符組成的指令應該通過讀輸入來執行,直到不能再讀取有效的輸入爲止,或者直到不是空白字符的第一個字節,它仍然是未讀的。「 (http://pubs.opengroup.org/onlinepubs/007904975/functions/scanf.html) – Mat 2012-04-22 15:30:13
@pmg謝謝。所以根據\ n的描述,格式字符串中的\ n並不一定意味着用戶必須使用\ n作爲輸入。所有被視爲空白的東西都會與\ n匹配,對嗎? – weidi 2012-04-22 15:43:52
這是正確的。同樣,許多轉換規範通過忽略主要空白字符來工作:例如'「%d」'和'「%d」'相同'\ n%d「'與\」\ n \ r \ v \ n \ n \ n%d「'並匹配'42'或' 42' –
pmg
2012-04-22 15:46:20