scanf 乙個神奇的函式

2021-07-02 03:43:00 字數 3496 閱讀 9527



scanf函式,與printf函式一樣,都被定義在stdio.h裡,因此在使用scanf函式時要加上#include。它是格式輸入函式,即按使用者指定的格式從鍵盤上把資料輸入到指定的變數之中,其關鍵字最末乙個字母f即為「格式」(format)之意。

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("%d%d", &a, &b);   如果a和b都被成功讀入,那麼scanf的返回值就是2   如果只有a被成功讀入,返回值為1   如果a和b都未被成功讀入,返回值為0   如果遇到錯誤或遇到end of

file,返回值為eof。   且返回值為int型.

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輸入時要注意,即此函式只能用於緩衝區非空的情況 */   #include   

void flush()      int main()   

呼叫scanf函式的乙個陷阱

我們在寫c程式時,經常使用scanf函式,讓使用者輸入資料,可是有時候會出現一些很奇怪的問題。例如,下面的程式是乙個簡單的四則運算 include int main printf 運算結果是 d n result return 0 此程式不管從語法,還是邏輯上,都沒有問題,且編譯也能通過。實際執行時...

乙個關於zip()函式的神奇發現

今天在看莫煩的pytorch教程的時候,在4種優化器的表現時有一段 沒看懂如下 losses if name main for epoch in range epoch for step,b x,b y in enumerate loader for net,opt,los in zip nets,...

pointer events,乙個神奇的css屬性

pointer events,搞前端的朋友們應該聽說過這個屬性吧。每年聖誕節的時候,許多網頁上都會掛出乙個雪花飄落的特效增加一些節日氣氛。有一些是用flash實現的,也有用html js實現的。當時就很好奇為何在頁面z軸最上層增加了乙個層卻完全不會影響下面元素的任何事件響應。簡直是前端黑科技。後來看...