![](/img/trans.png)
[英]Why does scanf put a string into a char array while directly inputting it does not work?
[英]why to put space between %d and %c while inputting there values using scanf
我是C的初學者,我正在編寫一個代碼來打印用戶輸入字符的正方形。
通常當我們需要使用scanf()
輸入兩個整數(比如x和y)時我們寫這個scanf("%d%d", &x, &y)
但是根據我的代碼的需要我應該輸入一個整數(說m)和一個角色(比如說ch)。
我把它寫成scanf("%d%c", &x, &ch)
但它有一個錯誤,當我執行程序時它只詢問輸入的積分值然后它就停止執行。
我搜索了這個,我發現我需要在%d
和%c
之間加上空格作為scanf("%d %c", &x, &ch);
任何人都可以解釋為什么我們需要在這之間留出空間嗎?
格式字符串中的空白字符的含義(來自http://www.cplusplus.com/reference/cstdio/scanf/?kw=scanf ):
空白字符:該函數將讀取並忽略在下一個非空白字符之前遇到的任何空白字符(空白字符包括空格,換行符和制表符 - 請參閱isspace)。 格式字符串中的單個空格驗證從流中提取的任何數量的空白字符(包括無)。
當您的代碼是:
scanf("%d%c", &x, &ch)
然后你進入
10
在你的控制台:
10
並存儲在x
。 ch
。 如果你使用
scanf("%d %c", &x, &ch)
然后你進入
10
10
並存儲在x
。 ch
。 這是因為stdin
通常是行緩沖的。 在嘗試讀取任何內容之前, scanf
幾乎所有格式說明符都會自動跳過所有空格。 例如, %d
工作原理(以及%s
, %f
和大多數其他說明符)。 但是, %c
是此行為的例外。 %c
不會跳過空格。 如果您的輸入數據包含空白字符, %c
將很樂意將該字符讀入您的ch
變量。
這很可能是你的情況。 如果你輸入
5 #
要創建一個5x5平方的#
s, %d
說明符將讀入5
進入x
並停止讀取空格字符。 然后%c
將該空格字符讀入ch
。 然后你的程序就會繼續, #
未讀。 你的程序的其余部分很可能實際上按預期工作。 這只是因為ch
是一個空格字符,它顯示一個5x5平方的空格字符,這些字符是不可見的:)為了使你的scanf
以其原始形式按預期工作,你必須輸入你的數據為
5#
但是確保你的scanf
實際上將#
字符讀入ch
更好的方法是在讀取ch
之前明確要求scanf
跳過所有空格。 在scanf
這是通過將任何空白字符(空格,換行符,制表符等)插入格式字符串來完成的。 這個
scanf("%d %c", &x, &ch);
將強制scanf
在5
之后跳過該空格並將#
讀入ch
。 這也適用於這樣的輸入
5 #
甚至像這樣
5
#
因為scanf
會自動跳過所有空格,直到它到達#
。 另請注意,即使使用更新的格式,也不需要輸入中的空格,這意味着此輸入
5#
仍然可以使用更新的scanf
。
您也可以使用這些變體
scanf("%d\t%c", &x, &ch);
scanf("%d\n%c", &x, &ch);
scanf("%d %c", &x, &ch);
scanf("%d \n \t %c", &x, &ch);
實現同樣的目標。 它們都是等價的。 第一個變體(帶空格)看起來更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.