簡體   English   中英

為什么在使用scanf輸入值時在%d和%c之間放置空格

[英]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

在你的控制台:

  1. 讀取10並存儲在x
  2. 換行字符被讀取並存儲在ch

如果你使用

scanf("%d %c", &x, &ch)

然后你進入

10
  1. 讀取10並存儲在x
  2. 消費換行符和其他空白字符。 程序等待非空白字符。 一旦輸入一行輸入並且該行中至少存在一個非空白字符,該行的第一個非白色字符將被讀入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);

將強制scanf5之后跳過該空格並將#讀入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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM