使用scanf和printf注意的問題

2021-03-04 09:44:40 字數 4488 閱讀 8617

其實這裡的10恰好是回車符!這是因為scanf()和getchar()函式是從輸入流緩衝區中讀取值的,而並非從鍵盤(也就是終端)緩衝區讀取。而讀取時遇到回車(\n)而結束的,這個\n會一起讀入輸入流緩衝區的,所以第一次接受輸入時取走字元後會留下字元\n,這樣第二次的讀入函式直接從緩衝區中把\n取走了,顯然讀取成功了,所以不會再從終端讀取!

這就是為什麼這個程式只執行了一次輸入操作就結束的原因!

這裡再插一句:ascii碼中的10是line feed-\n-換行,將當前位置移到下一行開頭;13是carriage return-\r-回車,將當前位置移到本行開頭。

在微軟的系統中,c程式處理文字是自動轉換這兩個符號的:

1、讀的時候將 \r\n 自動當作乙個字元 \n

2、寫的時候寫乙個 \n 自動轉換為 \r\n

造成一種誤解,好象 \n 就是回車加換行

你可以向乙個檔案中寫入乙個 '\n',用十六進製制編輯器開啟檔案,會發現有兩個位元組 0d 0a, 就是 \r\n了,你讀這個檔案的時候,也只會讀到乙個字元 \n

| 問題描述二:(分析scanf()和gets()讀取字串) |

首先我們看一下scanf()讀取字串的問題:

程式2:

程式的功能是讀入乙個字串輸出,再讀入乙個字串輸出。可我們會發現輸入的字串中不能出現空格,例如:

測試一:

hello world!

輸出:hello

world!

【分析】

到此程式執行完畢,不會執行第二次的讀取操作!這個問題的原因跟問題一類似,第一次輸入hello world!後,字串hello world!

都會被讀到輸入緩衝區中,而scanf()函式取資料是遇到回車、空格、tab就會停止,也就是第乙個scanf()會取出"hello",而"world!"還在緩衝區中,這樣第二個scanf會直接取出這些資料,而不會等待從終端輸入。

測試二:

hello[enter]

hello[輸出]

world[enter]

world[輸出]

【分析】

程式執行了兩次從鍵盤讀入字串,說明第一次輸入結束時的回車符被丟棄!即:scanf()讀取字串會捨棄最後的回車符!

我們再看一下gets()讀取字串的情況:

用scanf來讀取乙個字串時,字串中是不可以出現空格的,一旦出現空格,後面的資料就會被捨棄從而殘留在緩衝區中。其實有另外乙個函式是可以接受空格的,那就是gets(),下面我們看一下這個函式的應用,我們把程式2改動一下:

程式3:

測試:hello world! [輸入]

hello world! [輸出]

12345 [輸入]

12345 [輸出]

【分析】

顯然與上乙個程式的執**況不同,這次程式執行了兩次從鍵盤的讀入,而且第乙個字串取了hello world! 接受了空格符,而沒有像上乙個程式那樣分成了兩個字串!所以如果要讀入乙個帶空格符的字串時應該用gets(), 而不宜用scanf()!

| 問題描述三:(getchar()暫停程式,檢視程式執行結果)|

不知道大家有沒有遇到過這樣的問題,有的編譯器程式執行完後的結果介面不會停下而是一閃就沒了,以至於看不到執行結果。所以很多人在程式最後加上getchar()語句,目的是想讓程式執行完後停下來,等待從終端接收乙個字元再結束程式。可是發現有時候這樣根本沒用,程式照樣跳出去了。

這是為什麼呢?

【分析】

原因跟上面例子講的一樣,是因為輸入緩衝區中還有資料,所以getchar()會成果讀到資料,所以就跳出了!

| 【總結】 |

第一:要注意不同的函式是否接受空格符、是否捨棄最後的回車符的問題!

讀取字元時:

scanf()以space、enter、tab結束一次輸入,不會捨棄最後的回車符(即回車符會殘留在緩衝區中);

getchar()以enter結束輸入,也不會捨棄最後的回車符;

讀取字串時:

scanf()以space、enter、tab結束一次輸入

gets()以enter結束輸入(空格不結束),接受空格,會捨棄最後的回車符!

第二:為了避免出現上述問題,必須要清空緩衝區的殘留資料,可以用以下的方法解決:

方法1:c語言裡提供了函式清空緩衝區,只要在讀資料之前先清空緩衝區就沒問題了!

這個函式是fflush(stdin)。

方法2:自己取出緩衝區裡的殘留資料。

(說實話這個語句我也沒看懂,呵呵!為什麼格式控制是這樣的!希望高手指點一下!)

scanf("%[^\n]",string);//直至遇到回車結束; scanf("%[^\t^\n]",string);//直至遇到tab或回車結束;

再轉一篇~~~

scanf函式的一般形式:

scanf(格式控制,位址表列)

int scanf(char *format,argument,...);

「格式控制」的含義同printf函式;「位址表列」是由若干個位址組成的表列,可以是變數的位址,或字串首位址。

scanf()函式返回成功賦值的資料項數,出錯時則返回eof。

格式字元說明:

%a,%a 讀入乙個浮點值(僅c99有效)

%c 讀入乙個字元

%d 讀入十進位制整數

%i 讀入十進位制,八進位制,十六進製制整數

%o 讀入八進位制整數

%x,%x 讀入十六進製制整數

%c 讀入乙個字元

%s 讀入乙個字串,遇空格、製表符或換行符結束。

%f,%f,%e,%e,%g,%g 用來輸入實數,可以用小數形式或指數形式輸入。

%p 讀入乙個指標

%u 讀入乙個無符號十進位制整數

%n 至此已讀入值的等價字元數

% 掃瞄字元集合

%% 讀%符號

附加格式說明字元表修飾符說明:

l/l 長度修飾符輸入"長"資料

h 長度修飾符輸入"短"資料

w 整型常數指定輸入資料所佔寬度

* 表示本輸入項在讀入後不賦值給相應的變數

scanf的返回值:

scanf的返回值有後面的引數決定,scanf("%d%d", &a, &b);

1、如果a和b都被成功讀入,那麼scanf的返回值就是2

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

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

4、如果遇到錯誤或遇到end of file,返回值為eof。

使用scanf函式時應該注意的問題

1、sa**f()中的變數必須使用位址。

2、scanf()的格式控制串可以使用其它非空白字元,但在輸入時必須輸入這些字元。

3、在用"%c"輸入時,空格和「轉義字元」均作為有效字元。

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

輸入:i love you!

輸出:scanf()函式接收輸入資料時,遇以下情況結束乙個資料的輸入:(不是結束該scanf函式,scanf函式僅在每乙個資料域均有資料,並按回車後結束)。

① 遇空格、「回車」、「跳格」鍵。

② 遇寬度結束。

③ 遇非法輸入。

所以,上述程式並不能達到預期目的,scanf()掃瞄到"i"後面的空格就認為對str的賦值結束,並忽略後面的"love you!".這裡要注意是"love you!

"還在鍵盤緩衝區(關於這個問題,網上我所見的說法都是如此,但是,我經過除錯發現,其實這時緩衝區字串首尾指標已經相等了,也就是說緩衝區清空了,scanf()輸入乙個單詞沒問題,輸入兩個單詞無論加入多少個getchar()都會彈出?

請告訴我是什麼「道理」

scanf讀取時是遇到空格就停止讀取!也就是說如果你鍵入得是harry potter 那麼實際上scanf只能獲取harry這個單詞後面的「 potter」會在停在輸入流中那麼你就要最少要加9個getchar(乙個空格 6個單詞字母乙個換行符還有乙個待輸入游標)才能看到執行結果

用scanf函式輸入字串時,字串中不能含有空格,否則將以空格作為串的結束符。

為了避免這種情況,可多設幾個字元陣列分段存放含空格的串。

想知道誰在起作用很簡單,因為你輸入幾個單詞的時候,發現只有第乙個單詞能夠顯示出來,猜想scanf(%s)提取字元竄的條件是enter(換行--輸入結束)或者space(空格),而且還可以做個極端的測試,就你一開始只輸入換行或者空格,發現程式永遠不會執行printf,而只要我們輸入一竄連續字元+乙個空格之後,不論我們輸入什麼,enter之後,printf執行完之後都是一開始的一竄連續字元,因此我們還可以知道,scanf(%s)提取完成的語句格式是一開始遇到的一連竄字元;而由於執行getchar(),之前printf輸出的是scanf所提取的字元竄,而之後的字元或者空格包括回車將會被getchar()呼叫,其實你的程式兩個getchar()的作用只相當於乙個getchar()的作用,因為第乙個只不過讀取的是回車符,也就是你輸入乙個字元竄之後的回車鍵而已;因此當你輸入幾個用空格隔開的字元竄的時候,無用的getchar()的個數應該等於(回車數)1+n1(空格數)+n2(除第乙個連續有形字元竄的其他字元數);所以當你輸入兩個甚至幾個名字的時候,getchar()是遠遠不夠用的;

C語言Printf和Scan函式的使用方法

一 printf 函式是格式化輸出函式,一般用於向標準輸出裝置按規定格式輸出 資訊。在編寫程式時經常會用到此函式。printf 函式的呼叫格式為 printf 格式化字串 參量表 其中格式化字串包括兩部分內容 一部分是正常字元,這些字元將按原 樣輸出 另一部分是格式化規定字元,以 開始,後跟乙個或幾...

2023年一注 二註所使用的規範 標準

附件4 報名時印發給參加 一 二級註冊結構工程師專業考試的考生 2012年度全國一級註冊結構工程師專業考試 所使用的規範 標準 1 建築結構可靠度設計統一標準 gb50068 2001 2 建築結構荷載規範 gb50009 2001 2006年版 3 建築工程抗震設防分類標準 gb50223 200...

注氮系統安全使用制度

注氮系統安全技術措施 我礦井下注氮系統由兩台空壓機和一套製氮機組成,注氮系統由3寸管路連線一頭接至150107回採工作面採空區,另一頭接至井下其他工作面,為了保證安全使用,特制定本措施 一 基本情況 為了防止裝置公升井改造期間,150107工作面發生異常而無法注氮造成嚴重事故,經研究決定需在1501...