C語言 詳解輸入流

2021-08-19 21:45:56 字數 3535 閱讀 3914

c的輸入流:

int scanf(const char * restrict format,...);
函式 scanf() 是從標準輸入流stdio (標準輸入裝置,一般指向鍵盤)中讀內容的通用子程式,可以說明的格式讀入多個字元,並儲存在對應位址的變數中。

函式的第乙個引數是格式字串,它指定了輸入的格式,並按照格式說明符解析輸入對應位置的資訊並儲存於可變引數列表中對應的指標所指位置。每乙個指標要求非空,並且與字串中的格式符一一順次對應。

返回值:scanf函式返回成功讀入的資料項數,讀入資料時遇到了「檔案結束」則返回eof。

如:

scanf("%d

%d",&a,&b);

函式返回值為int型。如果a和b都被成功讀入,那麼scanf的返回值就是2;

如果只有a被成功讀入,返回值為1;

如果a和b都未被成功讀入,返回值為0;

如果遇到錯誤或遇到end of file,返回值為eof。end of file為ctrl+z 或者ctrl+d。

使用scanf輸入資料:

#include 

int main(void)

&a,&b,&c中的&是定址操作符,&a表示物件a在記憶體中的位址 [2] ,是乙個右值。變數a,b,c的位址是在編譯階段分配的(儲存順序由編譯器決定)。

這裡注意:如果scanf中%d是連著寫的如「%d%d%d」,在輸入資料時,資料之間不可以用逗號分隔,只能用空白字元(空格或tab鍵或者回車鍵)分隔——「2 (空格)3(tab) 4」 或 「2(tab)3(回車)4」等。若是「%d,%d,%d」,則在輸入資料時需要加「,」,如「2,3,4」。

空白字元

空白字元會使scanf函式在讀操作中略去輸入中的乙個或多個空白字元。

非空白字元

乙個非空白字元會使scanf()函式在讀入時剔除掉與這個非空白字元相同的字元。

說明:

(1)%s 表示讀字串,而 %d 表示讀整數。格式串的處理順序為從左到右,格式說明符逐一與變元表中的變元匹配。為了讀取長整數,可以將 l / l 放在格式說明符的前面;為了讀取短整數,可以將 h 放在格式說明符的前面。這些修飾符可以與 d、i、o、u 和 x 格式**一起使用。

(2)預設情況下,a、f、e 和 g 告訴 scanf() 為 float 分配資料。 如果將 l / l放在這些修飾符的前面,則 scanf() 為 double 分配資料。使用 l 就是告訴 scanf(),接收資料的變數是 long double 型變數。

(3)如果使用的現代編譯器程式支援 1995 年增加的寬字元特性, 則可以與 c 格式**一起,用 l 修飾符說明型別 wchar_t 的寬字元指標;也可以與 s 格式**一起,用 l 修飾符說明寬字串的指標。l 修飾符也可以用於修飾掃瞄集,以說明寬字元。

(4)控制串中的空白符使 scanf() 在輸入流中跳過乙個或多個空白行。空白符可以是空格(space)、製表符(tab)和新行符(newline)。 本質上,控制串中的空白符使 scanf() 在輸入流中讀,但不儲存結果,直到發現非空白字元為止。

(5)非空白符使 scanf() 在流中讀乙個匹配的字元並忽略之。例如,」%d,%d」 使 scanf() 先讀入乙個整數,讀入中放棄逗號,然後讀另乙個整數。如未發現匹配,scanf() 返回。

(6)scanf() 中用於儲存讀入值的變元必須都是變數指標,即相應變數的位址。

(7)在輸入流中,資料項必須由空格、製表符和新行符分割。逗號和分號等不是分隔符,比如以下**:

1 scanf(「%d%d」,&r,&c);

將接受輸入 10 20,但遇到 10,20 則失敗。

(8)百分號(%)與格式符之間的星號(*)表示讀指定型別的資料但不儲存。因此,

注意(1)在高版本的 visual studio 編譯器中,scanf 被認為是不安全的,被棄用,應當使用scanf_s代替 scanf。

(2) 對於字串陣列或字串指標變數,由於陣列名可以轉換為陣列和指標變數名本身就是位址,因此使用scanf()函式時,不需要在它們前面加上」&」操作符。

(3) 可以在格式化字串中的」%」各格式化規定符之間加入乙個整數,表示任何讀操作中的最大位數。

(4) scanf函式中沒有類似printf的精度控制。

如: scanf(「%5.2f」,&a); 是非法的。不能企圖用此語句輸入小數為2位的實數。

(5) scanf中要求給出變數位址,如給出變數名則會出錯

如 scanf(「%d」,a);是非法的,應改為scanf(「%d」,&a);才是合法的。

(6) 在輸入多個數值資料時,若格式控制串中沒有非格式字元作輸入資料之間的間隔,則可用空格,tab或回車作間隔。

c編譯在碰到空格,tab,回車或非法資料(如對「%d」輸入「12a」時,a即為非法資料)時即認為該資料結束。

(7) 在輸入字元資料(%c)時,若格式控制串中無非格式字元,則認為所有輸入的字元均為有效字元。

例如:

例如:

scanf("%c

%c%c",&a,&b,&c);

輸入為:d e f

則把』d』賦予a, 』 『(空格)賦予b,』e』賦予c。因為%c 只要求讀入乙個字元,後面不需要用空格作為兩個字元的間隔,因此把』 『作為下乙個字元送給b。

只有當輸入為:def(字元間無空格) 時,才能把』d』賦於a,』e』賦予b,』f』賦予c。 如果在格式控制中加入空格作為間隔,

scanf("%c

%c%c",&a,&b,&c);

則輸入時各資料之間可加空格。

問題如何讓scanf()函式正確接受有空格的字串?如: i love you!

#include 

int main(void)

輸入:

i love you!

輸出:i

上述程式並不能達到預期目的。因為scanf掃瞄到」i」後面的空格就認為對str的掃瞄結束(空格沒有被掃瞄),並忽略後面的」 love you!」。值得注意的是,我們改動一下上面的程式來驗證一下:

#include

#include

int main(void)

輸入:

i love you!

輸出:

i love

you!

好了,原因知道了,所以結論是:殘留的資訊 love you是存在於stdin流中,而不是在鍵盤緩衝區中。那麼scanf()函式能不能完成這個任務?回答是:能!別忘了scanf()函式還有乙個 % 格式控制符(如果對%不了解的請檢視本文的上篇),請看下面的程式:

#include

int main(void)

{char

str[50];

scanf("%[^\n]",str);/*scanf("%s",string);不能接收空格符*/

printf("%s\n",str);

return

0;

C cin輸入流詳解

標準輸入流是從標準輸入裝置 鍵盤 流向程式的資料。在標頭檔案iostream.h中定義了cin cout cerr clog 4個流物件 詳情請檢視 與c 輸入輸出有關的類和物件 cin是輸入流,cout cerr clog是輸出流。cin是istream類的物件,它從標準輸入裝置 鍵盤 獲取資料,...

c 標準輸入流

cin是istream類的派生類物件,它從標準輸入裝置 鍵盤 獲取資料,程式中的變數通過流提取符 從流中提取資料。提取資料時通常跳過輸入流中的空格,tab鍵,換行符等空白字元。只有在鍵盤輸入完資料並按enter鍵之後,該行資料才被送入鍵盤緩衝區,形成輸入流,提取運算子 才能從中提取資料 在遇到無效字...

C 標準輸入流

define crt secure no warnings includeusing namespace std if 0 標準輸入流物件 cin,重點掌握的函式 cin.get 一次只能讀取乙個字元 cin.get 乙個引數 讀乙個字元 cin.get 三個引數 可以讀字串 cin.getline...