久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > scanf函數簡單問題(ti)討論

scanf函數(shu)簡單問題討論 時間:2018-09-26      來源:未知

曾經錯的幾個地方:(xpsp2,vc6.0環境下)

1.空白符問題

#include

main()

{

int a;

printf("input the data\n");

scanf("%d\n",&a);//這里多了一個回車符\n

printf("%d",a);

return 0;

}

結果要輸入兩個數程(cheng)序才結束(shu),而不是預期的(de)一(yi)個。why?

原因(yin):用空白(bai)(bai)符(fu)結(jie)尾時,scanf會跳(tiao)過空白(bai)(bai)符(fu)去讀下一個字符(fu),所以你必須再輸入一個數。這里的空白(bai)(bai)符(fu)包(bao)括空格,制(zhi)表(biao)符(fu),換行符(fu),回車(che)符(fu)等。所以如(ru)果你用scanf("%d ",&a)也會出現(xian)同樣的問(wen)題。

解決方法:這種(zhong)(zhong)錯(cuo)誤大(da)多是輸入的時候不小心(xin),多注意一(yi)點就好了(le)。這種(zhong)(zhong)問題也不好檢查,編譯沒有問題,一(yi)個空格也不容易看出(chu)來。當你的程序出(chu)現上(shang)面的問題時,自己對(dui)照檢查一(yi)下就可(ke)以了(le)。

2.緩沖區問題(“垃圾”字(zi)符)

這是一(yi)個非常(chang)容(rong)易(yi)錯的地(di)方,我(wo)就錯過多次。

#include

main()

{

int n = 5;

char c[n];

for(int i = 0; i < n; i++)

c[i] = scanf("%c",&c[i]);

printf(c);

return 0;

}

如果輸入:

a

b

c

那么循環就會“提(ti)前”結束了.

原因:輸(shu)入(ru)a和第(di)(di)(di)一(yi)(yi)個(ge)(ge)回(hui)車(che)后,a和這(zhe)個(ge)(ge)回(hui)車(che)符都(dou)留(liu)(liu)在緩沖區中(zhong)。第(di)(di)(di)一(yi)(yi)個(ge)(ge)scanf讀取(qu)了(le)(le)a,但是(shi)輸(shu)入(ru)緩沖區里面(mian)還留(liu)(liu)有(you)一(yi)(yi)個(ge)(ge)\n,第(di)(di)(di)二個(ge)(ge)scanf讀取(qu)這(zhe)個(ge)(ge)\n。然后輸(shu)入(ru)b和第(di)(di)(di)二個(ge)(ge)回(hui)車(che),同樣的,第(di)(di)(di)三個(ge)(ge)scanf讀取(qu)了(le)(le)b,第(di)(di)(di)四(si)個(ge)(ge)scanf讀取(qu)了(le)(le)第(di)(di)(di)二個(ge)(ge)回(hui)車(che)符。第(di)(di)(di)五個(ge)(ge)讀取(qu)了(le)(le)c。所(suo)以五個(ge)(ge)scanf都(dou)執行(xing)了(le)(le),并沒有(you)提(ti)前(qian)結束。只不過有(you)的scanf讀取(qu)到了(le)(le)回(hui)車(che)符而已。

解決方法:把(ba)程(cheng)序改成(cheng)這樣就可以了:

for( i = 0; i < n; i++){

scanf("%c",&c[i]);

fflush(stdin);//刷新緩沖區

}

或者不用(yong)scanf,而用(yong)gets()函數,如:

#include

main()

{

char c[5];

gets(c);

printf(c);

return 0;

}

但(dan)要注(zhu)意:這個函數自(zi)動把你(ni)后(hou)敲的(de)回車轉換為(wei)字符'\0'。如(ru)果你(ni)的(de)輸入超過了數組的(de)大(da)小,那么就會(hui)產生(sheng)錯誤。

3.scanf()函數的(de)參數輸入類型不匹配問題

這是我在csdn論壇上見(jian)到的問題,這個錯誤有時候會讓人莫名(ming)其妙。

#include

main()

{

int a=123;

char c='t';

printf("input\n");

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

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

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

printf("%d\n%c\n",a,c);

return 0;

}

當輸入a 回車 后(hou),會(hui)直(zhi)接跳過下(xia)面2個scanf語句,直(zhi)接輸出為

123

t

原因:對于scanf("%d%c",&a,&c),scanf語句執行(xing)時,首(shou)先試圖從緩(huan)沖(chong)區中(zhong)讀入一個%d類型的數據,如果和(he)第一個參(can)數匹配,則繼續從緩(huan)沖(chong)區中(zhong)讀取數據和(he)第二個參(can)數進行(xing)匹配,依次進行(xing)下去,直到匹配完所有的參(can)數;

如(ru)果其中(zhong)有(you)一個參數不匹配,那就從這(zhe)個地方跳出,忽略這(zhe)個scanf后面所有(you)的參數,而去(qu)執行下一條語句。

可以(yi)用(yong)下面的(de)程序驗證一下:

#include

int main()

{

int a=123,b=1;

char c='t';

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

scanf("%c",&c);

printf("%d\n%d\n%c\n",a,b,c);

return 0;

}輸(shu)入:2 回車a 回車

結果是:

2

1

a

解決方法:scanf()函數(shu)執行成功時的返回值是(shi)(shi)成功讀取的變(bian)量(liang)數(shu),也就是(shi)(shi)說,你這個scanf()函數(shu)有幾(ji)個變(bian)量(liang),如果scanf()函數(shu)全(quan)部(bu)正常讀取,它就返回幾(ji)。但這里還要注意(yi)另一個問(wen)題(ti),如果輸入了(le)非法數(shu)據,鍵盤緩沖區就可能還個有殘(can)余信息問(wen)題(ti)。

比如:

#include

main()

{

int a=123,b;

while(scanf("%d%d",&;a,&b)!=2)

fflush(stdin);

printf("%d\n%d\n",a,b);

return 0;

}

你可以試(shi)一下,如果輸入不是數(shu)字時,會有(you)什(shen)么反應。

補充:scanf中一種很(hen)少見但很(hen)有用的轉換字符:[...]和[ ^...]。

#include

main()

{

char strings[100];

scanf("%[1234567890]",strings);

printf("%s",strings);

return 0;

}

運行(xing),輸(shu)入:1234werew后,結果是:1234。

通過運行可以(yi)發(fa)現(xian)它的作(zuo)用是:如果(guo)輸入(ru)的字符屬(shu)于方(fang)(fang)括號內字符串中某(mou)個字符,那么就(jiu)提(ti)取該(gai)字符;如果(guo)一(yi)經發(fa)現(xian)不屬(shu)于就(jiu)結束提(ti)取。該(gai)方(fang)(fang)法會自動加上(shang)一(yi)個字符串結束符到已經提(ti)取的字符后面。

scanf("%[^1234567890]",strings); 它的作用是:如果(guo)一經發現輸(shu)入的字(zi)符(fu)(fu)屬于(yu)方括(kuo)號內字(zi)符(fu)(fu)串中某(mou)個字(zi)符(fu)(fu),那么就(jiu)結(jie)束(shu)提取(qu);如果(guo)不(bu)屬于(yu)就(jiu)提取(qu)該字(zi)符(fu)(fu)。該方法會自動加上一個字(zi)符(fu)(fu)串結(jie)束(shu)符(fu)(fu)到已經提取(qu)的字(zi)符(fu)(fu)后面。

注意:方(fang)括號(hao)兩邊不(bu)能空格,如:scanf("%[ 1234567890 ]&quot;,strings); scanf(&quot;%[ ^1234567890 ]",strings); 不(bu)讓空格也會算(suan)在里面的。

用這種方(fang)法還可(ke)以解決scanf的(de)輸入中不能有空格的(de)問題。只(zhi)要用

scanf(&quot;%[^\n]";,strings); 就可(ke)以了。很神奇吧。

scanf原型:參見《C語(yu)言(yan)大全(quan)》和K&C

# include ;

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

函數 scanf() 是(shi)從標(biao)準輸入流 stdin 中讀(du)內(nei)容的(de)(de)通用(yong)子(zi)程序,可以(yi)讀(du)入全部固有類型(xing)的(de)(de)數據并自動轉(zhuan)換成機內(nei)形式。

在(zai) C99 中,format 用(yong) restrict 修(xiu)飾。

format 指向的控制串由以下三類字符組成:

● 格(ge)式(shi)說明符(fu)

● 空白符

● 非空白符

轉換(huan)字(zi)符(就是%后跟的部分)

a 讀浮點值(zhi)(僅適用于 C99)

A 讀(du)浮(fu)點(dian)值(僅適用于 C99)

c 讀單字符

d 讀十(shi)進制整數

i 讀(du)十(shi)進(jin)制(zhi)、八進(jin)制(zhi)、十(shi)六進(jin)制(zhi)整數

e 讀浮點(dian)數

E 讀浮點數

f 讀浮點數

F 讀浮點數(僅適(shi)用于(yu) C99)

g 讀浮點數

G 讀浮點數

o 讀八進制(zhi)數

s 讀字符串

x 讀十六進制數(shu)

X 讀十六(liu)進制數

p 讀指針值

n 至(zhi)此已讀(du)入值的等(deng)價(jia)字符數

u 讀無符號十進制整數(shu)

[ ] 掃描(miao)字符集合(he)

% 讀 % 符號(百分(fen)號)

例(li)如: %s 表示讀(du)串(chuan)而 %d 表示讀(du)整數。格(ge)式串(chuan)的(de)(de)處理(li)順(shun)序為從左到右(you),格(ge)式說(shuo)明符(fu)逐(zhu)一(yi)與變元表中的(de)(de)變元匹配(pei)。為了讀(du)取長(chang)整數,可(ke)(ke)以將 l(ell) 放在格(ge)式說(shuo)明符(fu)的(de)(de)前面;為了讀(du)取短整數,可(ke)(ke)以將 h 放在格(ge)式說(shuo)明符(fu)的(de)(de)前面。這些修飾符(fu)可(ke)(ke)以與 d、i、o、u 和(he) x 格(ge)式代碼一(yi)起使用(yong)。

默認情況下,a、f、e 和 g 告訴(su) scanf() 為 float 分配(pei)數據(ju)。 如果將 l(ell) 放在這些修飾(shi)符(fu)的前(qian)面,則 scanf() 為 double 分配(pei)數據(ju)。使用 L 就是告訴(su) scanf(),接(jie)收數據(ju)的變量是 long double 型變量。

如果使用(yong)的(de)現代(dai)編譯器程序支(zhi)持 1995 年增加的(de)寬(kuan)(kuan)字(zi)(zi)符(fu)特性, 則可以(yi)與 c 格式(shi)(shi)代(dai)碼(ma)一起,用(yong) l 修(xiu)(xiu)飾(shi)(shi)符(fu)說(shuo)明(ming)類型(xing) wchar_t 的(de)寬(kuan)(kuan)字(zi)(zi)符(fu)指針(zhen);也(ye)可以(yi)與 s 格式(shi)(shi)代(dai)碼(ma)一起,用(yong) l 修(xiu)(xiu)飾(shi)(shi)符(fu)說(shuo)明(ming)寬(kuan)(kuan)字(zi)(zi)符(fu)串的(de)指針(zhen)。l 修(xiu)(xiu)飾(shi)(shi)符(fu)也(ye)可以(yi)用(yong)于修(xiu)(xiu)飾(shi)(shi)掃(sao)描(miao)集,以(yi)說(shuo)明(ming)寬(kuan)(kuan)字(zi)(zi)符(fu)。

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

非空(kong)白符使 scanf() 在流中(zhong)(zhong)讀(du)一(yi)個匹配的字符并忽略之。例如(ru),"%d,%d" 使 scanf() 先(xian)讀(du)入(ru)一(yi)個整數,讀(du)入(ru)中(zhong)(zhong)放棄逗號,然后讀(du)另一(yi)個整數。如(ru)未發現匹配,scanf() 返(fan)回。

scanf() 中用于保存讀入值的變(bian)(bian)元必須都是變(bian)(bian)量指(zhi)針,即相應變(bian)(bian)量的地址(zhi)。

在輸入(ru)流中(zhong),數(shu)據項必須由空(kong)格、制表(biao)符(fu)(fu)和新行符(fu)(fu)分(fen)(fen)割。逗號和分(fen)(fen)號等不是(shi)分(fen)(fen)隔符(fu)(fu),比如以下代碼:

scanf( "%d %d", &r, &c );

將接(jie)受輸(shu)入 10 20,但遇到(dao) 10,20 則失敗。

百分號(%)與格式(shi)符之間的星號(*)表示讀指定類型的數據但(dan)不保存。因此,

scanf( "%d %*c %d", &x, &y );

對 10/20 的讀入(ru)(ru)操作(zuo)中,10 放入(ru)(ru)變量(liang) x,20 放入(ru)(ru) y。

格式(shi)命令可以說明大域寬(kuan)。 在百分(fen)號(hao)(%)與格式(shi)碼之間的整數(shu)用于限制從對應域讀入(ru)的大字符數(shu)。例如,希望(wang)向 address 讀入(ru)不多于 20 個字符時,可以書(shu)寫(xie)成如下形式(shi):

scanf( "%20s", address );

如果輸入流的內容多于(yu) 20 個字符(fu),則(ze)下次 scanf() 從(cong)此次停(ting)止處開始(shi)讀入。 若達到(dao)(dao)大域寬(kuan)前已(yi)遇(yu)到(dao)(dao)空(kong)白符(fu),則(ze)對該域的讀立即停(ting)止;此時,scanf() 跳到(dao)(dao)下一個域。

雖然空格、制表符(fu)(fu)(fu)和新行符(fu)(fu)(fu)都用(yong)(yong)做域分割(ge)符(fu)(fu)(fu)號(hao),但讀單字符(fu)(fu)(fu)操作(zuo)中卻(que)按一般字符(fu)(fu)(fu)處理。例(li)如(ru),對輸入流 "x y" 調(diao)用(yong)(yong):

scanf( "%c%c%c", &a, &b, &amp;c );

返(fan)回后,x 在(zai)變量 a 中,空格在(zai)變量 b 中,y 在(zai)變量 c 中。

注(zhu)意,控(kong)制串中的(de)(de)其它(ta)字符(fu),包括空格、制表符(fu)和新行符(fu),都用于從(cong)輸入流中匹(pi)配(pei)并(bing)放棄(qi)(qi)字符(fu),被匹(pi)配(pei)的(de)(de)字符(fu)都放棄(qi)(qi)。例如,給定輸入流 "10t20",調用:

scanf( "%dt%d", &x, &y );

將把 10 和 20 分別放到 x 和 y 中(zhong),t 被放棄(qi),因(yin)為 t 在控制串中(zhong)。

ANSI C 標準向 scanf() 增加了(le)一種新(xin)特性,稱(cheng)為(wei)掃(sao)描集(scanset)。 掃(sao)描集定義(yi)(yi)一個字符集合,可(ke)由 scanf() 讀入其中(zhong)允許的(de)字符并賦給對(dui)(dui)應字符數組。 掃(sao)描集合由一對(dui)(dui)方括號(hao)中(zhong)的(de)一串字符定義(yi)(yi),左方括號(hao)前必(bi)須綴(zhui)以百(bai)分號(hao)。 例(li)如(ru),以下的(de)掃(sao)描集使 scanf() 讀入字符 A、B 和 C:

%[ABC]

使(shi)用掃描集(ji)(ji)時(shi),scanf() 連續(xu)吃(chi)進集(ji)(ji)合(he)中的(de)(de)字符(fu)(fu)(fu)并放入對應的(de)(de)字符(fu)(fu)(fu)數組,直(zhi)到發(fa)現(xian)不在(zai)集(ji)(ji)合(he)中的(de)(de)字符(fu)(fu)(fu)為(wei)止(即掃描集(ji)(ji)僅讀匹配的(de)(de)字符(fu)(fu)(fu))。返(fan)回時(shi),數組中放置(zhi)以 null 結尾、由讀入字符(fu)(fu)(fu)組成的(de)(de)字符(fu)(fu)(fu)串。

用字(zi)(zi)符(fu) ^ 可以說明(ming)補集。把 ^ 字(zi)(zi)符(fu)放為掃描集的(de)第一(yi)字(zi)(zi)符(fu)時,構成(cheng)其它(ta)字(zi)(zi)符(fu)組成(cheng)的(de)命令的(de)補集合,指(zhi)示 scanf() 只(zhi)接受(shou)未說明(ming)的(de)其它(ta)字(zi)(zi)符(fu)。

 對(dui)于許多(duo)實現來(lai)說,用連字符可以(yi)說明(ming)一(yi)個(ge)范圍。 例如,以(yi)下(xia)掃描(miao)集使(shi) scanf() 接(jie)受字母 A 到 Z:

%[A-Z]

重要的(de)(de)是要注(zhu)意掃描(miao)集(ji)是區分大小寫的(de)(de)。因此,希望掃描(miao)大、小寫字符時(shi),應該分別說明大、小寫字母(mu)。

scanf() 返(fan)回(hui)(hui)等于(yu)成功(gong)賦(fu)值的(de)域數的(de)值,但由(you)于(yu)星號修飾(shi)符(fu)而讀入未賦(fu)值的(de)域不(bu)計算在內(nei)。給第一個域賦(fu)值前已出錯時,返(fan)回(hui)(hui) EOF。

C99 為 scanf() 增加(jia)了幾個(ge)格式修(xiu)飾(shi)(shi)符:hh、ll、j、z 和 t。hh 修(xiu)飾(shi)(shi)符可(ke)(ke)用于(yu) d、i、o、u、x、X 或(huo)(huo) n。它說明(ming)相(xiang)應的變元是(shi) signed 或(huo)(huo) unsigned char 值(zhi)(zhi),或(huo)(huo)用于(yu) n 時(shi), 相(xiang)應的變元是(shi)指向(xiang) long char 型變量(liang)的指針(zhen)。ll 修(xiu)飾(shi)(shi)符也可(ke)(ke)用于(yu) d、i、o、u、x、X 或(huo)(huo) n。它說明(ming)相(xiang)應的變元是(shi) signed 或(huo)(huo)者 unsigned long long int 值(zhi)(zhi)。

j 格式修飾符應用于 d、i、o、u、x、X 或 n,說明匹配的變元是類型 intmax_t 或 uintmax_t。這些類型在 ; 中聲明,并說明大寬度的整數。

z 格式修飾符應用于 d、i、o、u、x、X 或 n,說明匹配的變元是指向 size_t 類型對象的指針。該類型在 ; 中聲明,并說明 sizeof 的結構。

t 格式修飾符應用于 d、i、o、u、x、X 或 n,說明匹配的變元是指向 ptrdiff_t 類型對象的指針。該類型在 ; 中聲明,并說明兩個指針之間的差別。

例子:

# include ;

int main( void )

{

char str[80], str2[80];

int i;

/* read a string and a integer */

scanf( "%s%d", str, &i );

/* read up to 79 chars into str */

scanf( "%79s", str );

/* skip the integer between the two strings */

scanf( "%s%*d%s", str, str2 );

return 0;

}

上一篇:arduino花式點燈續

下一篇:靜態庫和動態庫的制作

熱點文章(zhang)推薦
華(hua)清學員就業榜(bang)單
高(gao)薪學員經驗(yan)分享
熱點新聞(wen)推薦
前臺專線:010-82525158 企業(ye)培訓洽(qia)談專線:010-82525379 院校(xiao)合作(zuo)洽談專(zhuan)線(xian):010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部