scanf函式有n,其作用是什麼

時間 2021-08-30 10:50:24

1樓:匿名使用者

用:scanf函式,與printf函式一樣,都被定義在stdio.h裡,因此在使用scanf函式時要加上#include。

它是格式輸入函式,即按使用者指定的格式從鍵盤上把資料輸入到指定的變數之中,其關鍵字最末一個字母f即為「格式」(format)之意。

[編輯本段]scanf函式的一般形式

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

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

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

scanf()函式返回成功賦值的資料項數,讀到檔案末尾出錯時則返回eof。

例:使用scanf函式輸入資料。

在visual c++ 6.0上的編寫方式。

#include

void main()

在dev-c++上執行程式為:

#include

int main()

注意上面的scanf("%d,%d,%d",&a,&b,&c);中%d,%d,%d之間有逗號,在輸入資料時也要加逗號,如果去掉逗號,輸入時就不用逗號,而用空格,tab鍵或回車鍵將各個資料隔開

[編輯本段]格式字元說明

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

%c 讀入一個字元

%d 讀入十進位制整數

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

%o 讀入八進位制整數

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

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

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

%p 讀入一個指標

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

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

% 掃描字符集合

%% 讀%符號

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

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

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

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

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

[編輯本段]scanf的返回值

scanf的返回值有後面的引數決定

scanf("%d%d", &a, &b);

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

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

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

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

且返回值為int型.

[編輯本段]使用scanf函式時應該注意的問題

1、scanf()中的變數必須使用地址。

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

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

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

#include

int main()

輸入:i love you!

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

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

② 遇寬度結束。

③ 遇非法輸入。

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

"還在鍵盤緩衝區(關於這個問題,網上我所見的說法都是如此,但是,我經過除錯發現,其實這時緩衝區字串首尾指標已經相等了,也就是說緩衝區清空了,scanf()函式應該只是掃描stdin流,這個殘存資訊是在stdin中)。我們改動一下上面的程式來驗證一下:

#include

#include

int main()

輸入:i love you!

輸出:i

love

you!

好了,原因知道了,那麼scanf()函式能不能完成這個任務?回答是:能!別忘了scanf()函式還有一個 % 格式控制符(如果對%不瞭解的請檢視本文的上篇),請看下面的程式:

#include "stdio.h"

int main()

問題二:鍵盤緩衝區殘餘資訊問題

#include

int main()

while(c!='n');

} scanf("%c",&c);這句不能正常接收字元,什麼原因呢?我們用printf("c=%d\n",c);將c用int表示出來,啟用printf("c=%d\n",c);這一句,看看scanf()函式賦給c到底是什麼,結果是c=10 ,ascii值為10是什麼?換行即\n.

對了,我們每擊打一下"enter"鍵,向鍵盤緩衝區發去一個「回車」(\r),一個「換行"(\n),在這裡\r被scanf()函式處理掉了(姑且這麼認為吧^_^),而\n被scanf()函式「錯誤」地賦給了c.解決辦法:可以在兩個scanf()函式之後加個fflush(stdin);,還有加getch() , getchar()也可以,但是要視具體scanf()語句加那個,這裡就不分析了,讀者自己去摸索吧。

但是加fflush(stdin);不管什麼情況都可行。

(函式名: fflush

功 能: 清除一個流

用 法: int fflush(file *stream);

)#include

int main()

while(c!='n');

} 這裡再給一個用「空格符」來處理緩衝區殘餘資訊的示例:執行出錯的程式:

#include

int main()

}使用了空格控制符後:

#include

int main()

} 可以執行看看兩個程式有什麼不同。

問題三: 如何處理scanf()函式誤輸入造成程式死鎖或出錯?

#include

int main()

如上程式,如果正確輸入a,b的值,那麼沒什麼問題,但是,你不能保證使用者每一次都能正確輸入,一旦輸入了錯誤的型別,你的程式不是死鎖,就是得到一個錯誤的結果,呵呵,這可能所有人都遇到過的問題吧?解決方法:scanf()函式執行成功時的返回值是成功讀取的變數數,也就是說,你這個scanf()函式有幾個變數,如果scanf()函式全部正常讀取,它就返回幾。

但這裡還要注意另一個問題,如果輸入了非法資料,鍵盤緩衝區就可能還個有殘餘資訊問題。正確的例程:

#include

int main()

補充: fflush(stdin)這個方法在gcc下不可用。(在vc6.0下可以)

以下是 c99 對 fflush 函式的定義:

int fflush(file *stream);

如果stream指向輸出流或者更新流(update stream),並且這個更新流

最近執行的操作不是輸入,那麼fflush函式將把任何未被寫入的資料寫入stream

指向的檔案(如標準輸出檔案stdout)。否則,fflush函式的行為是不確定的。

fflush(null)清空所有輸出流和上面提到的更新流。如果發生寫錯誤,fflush

函式會給那些流打上錯誤標記,並且返回eof,否則返回0。

由此可知,如果 stream 指向輸入流(如 stdin),那麼 fflush 函式的行為是不確定的。故而使用

fflush(stdin) 是不正確的,至少是移植性不好的。

可採用如下方法:

/* 此函式可以和scanf函式一起使用,但使用%c輸入時要注意,即此函式只能用於緩衝區非空的情況 */

void flush()

#include

int main()

希望對你有幫助 祝你學習進步

2樓:匿名使用者

代表自動轉到下一行 相當於一個回車

3樓:匿名使用者

先輸入一個回車再輸入資料。

4樓:匿名使用者

scanf 格式輸入函式

函式作用:按照變數在記憶體的地址將變數值存進去。

一般格式:scanf(格式控制,地址表列)其中,格式控制:

%d:以帶符號的十進位制形式輸出整數

%o:以八進位制無符號形式輸出整數

%x:以十六進位制無符號形式輸出整數

%u:以無符號十進位制形式輸出整數

%c:以字元形式輸出,只輸出一個字元

%s:輸出字串

%f:以小數形式輸出單,雙精度數,隱含輸出六位小數%e:以指數形式輸出實數

%g:選用%f或%e格式中輸出寬度較短的一種格式,不輸出無意義的0

在格式控制的字母前面可以用幾種常見的格式符的修飾符,作用如下:

l:用於長整型整數,可加在格式符d,o,x,u前面m(代表一個正整數):資料最小寬度

n(代表一個正整數):對實數,表示輸出n位小數;

對字串,表示擷取的字元個數

地址列表:是由若干個地址組成的表列,可以是變數的地址,或字串的首地址

舉例:用scanf函式輸入資料。

#include

void main()

運**況:3 4 5 (回車) (輸入a,b,c的值)3,4,5 (輸出a,b,c的值)

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

(1)scanf函式中的「格式控制」後面應當是變數地址,而不應是變數名。

(2) 如果在「格式控制」字串中除了格式說明以外還有其他字元,則在輸入資料時在對應位置應輸入與這些字元相同的字元。

(3) 在用「%c」格式輸入字元時,空格字元和「轉義字元」都作為有效字元輸入

(4) 在輸入資料時,遇以下情況時認為該資料結束。

① 遇空格,或按「回車」或「跳格」(tab)鍵;

② 按指定的寬度結束,如「%3d」,只取3列;

③ 遇非法輸入。

c語言中的scanf是什麼意思

5樓:匿名使用者

scanf()是c語言中的bai一個輸入函式。du與printf函式一樣,都被宣告在頭文zhi件stdio.h裡,因此在使dao用scanf函式時要加上#include 。

(版在有一些實現權中,printf函式與scanf函式在使用時可以不使用預編譯命令#include 。)

函式 scanf() 是格式輸入函式,即按使用者指定的格式從鍵盤上把資料輸入到指定的變數之中。scanf() 從標準輸入流stdin中讀內容的通用子程式,可以說明的格式讀入多個字元,並儲存在對應地址的變數中。

擴充套件資料:scanf()用法舉例:

用scanf輸入一個整數

#include

int main()

煙的作用是什麼,煙囪的作用是什麼?其工作原理如何?

蹄子 對身體沒有任何好處,只能是讓尼古丁麻痺大腦神經來緩解情緒上的壓力 是一種變相型的 鴉片 國家不制止是因為煙給國家創造的稅收太可觀了 fzn奇妙 煙在汽車維修中可以診斷故障。但對於人體是害的。檢查氣門與氣門座的密封性。檢查變速器 後橋殼 轉向器殼上的通氣孔和發動機曲軸箱氣體單向閥 pcv 是否暢...

什麼是輔幣?其作用是什麼,理工學科是什麼

錢幣有才說 家中的輔幣是什麼樣子,原來我們都沒注意,輔幣之間有何區別? 卡尼迪 輔幣,即輔助貨幣,是指本位幣單位以下的小額貨幣輔助大面額貨幣的流通,供日常零星交易或找零之用,它的特點是面額小,流通頻繁,磨損快,故多用銅 鎳及其合金等賤金屬鑄造,也有些輔幣是紙製的。輔幣一般是有限清償貨幣,即每次交付的...

c 什麼叫建構函式,它的作用是什麼

建構函式的名字和類的名字一樣,並且沒有返回值型別。通常用於初始化私有的資料成員。 小杰知音 c 類的建構函式詳解 一 建構函式是幹什麼的 class counter private 資料成員 int m value 該類物件被建立時,編譯系統物件分配記憶體空間,並自動呼叫該建構函式 由建構函式完成成...