C語言scanf函數(shù)詳細(xì)解釋

      網(wǎng)友投稿 1321 2022-05-29

      函數(shù)名: scanf

      功 能: 執(zhí)行格式化輸入

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

      scanf()函數(shù)是通用終端格式化輸入函數(shù),它從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤) 讀取輸入的信息。可以讀入任何固有類型的數(shù)據(jù)并自動把數(shù)值變換成適當(dāng)?shù)臋C內(nèi)格式。

      其調(diào)用格式為: scanf("<格式化字符串>",<地址表>);

      scanf()函數(shù)返回成功賦值的數(shù)據(jù)項數(shù),出錯時則返回EOF。

      其控制串由三類字符構(gòu)成:

      1。格式化說明符;

      2。空白符;

      3。非空白符;

      (A) 格式化說明符

      格式字符 說明

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

      %A 同上

      %c 讀入一個字符

      %d 讀入十進制整數(shù)

      %i 讀入十進制,八進制,十六進制整數(shù)

      %o 讀入八進制整數(shù)

      %x 讀入十六進制整數(shù)

      %X 同上

      %c 讀入一個字符

      %s 讀入一個字符串

      %f 讀入一個浮點數(shù)

      %F 同上

      %e 同上

      %E 同上

      %g 同上

      %G 同上

      %p 讀入一個指針

      %u 讀入一個無符號十進制整數(shù)

      %n 至此已讀入值的等價字符數(shù)

      %[] 掃描字符集合

      %% 讀%符號

      附加格式說明字符表

      修飾符 說明

      L/l 長度修飾符 輸入"長"數(shù)據(jù)

      h 長度修飾符 輸入"短"數(shù)據(jù)

      W 整型常數(shù) 指定輸入數(shù)據(jù)所占寬度

      星號 空讀一個數(shù)據(jù)

      hh,ll同上h,l但僅對C99有效。

      (B) 空白字符

      空白字符會使scanf()函數(shù)在讀操作中略去輸入中的一個或多個空白字符,空白符可以是space,tab,newline等等,直到第一個非空白符出現(xiàn)為止。

      (C) 非空白字符

      一個非空白字符會使scanf()函數(shù)在讀入時剔除掉與這個非空白字符相同的字符。

      scanf函數(shù)探討

      1.空白符問題

      #include

      main()

      {

      int a;

      printf( "input the data/n ");

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

      printf( "%d ",a);

      return 0;

      }

      結(jié)果要輸入兩個數(shù)程序才結(jié)束,而不是預(yù)期的一個。why?

      原因:用空白符結(jié)尾時,scanf會跳過空白符去讀下一個字符,所以你必須再輸入一個數(shù)。這里的空白符包括 空格,制表符,換行符,回車符和換頁符。所以如果你用scanf( "%d ",&a)也會出現(xiàn)同樣的問題。

      解決方法:這種錯誤大多是輸入的時候不小心,多注意一點就好了。這種問題也不好檢查,編譯沒有問題, 一個空格也不容易看出來。當(dāng)你的程序出現(xiàn)上面的問題時,自己對照檢查一下就可以了。

      2.緩沖區(qū)問題

      這是一個非常容易錯的地方,我就錯過多次。

      #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 那么循環(huán)就會“提前”結(jié)束了.

      原因:輸入a和第一個回車后,a和這個回車符都留在緩沖區(qū)中。第一個scanf讀取了a,但是輸入緩沖區(qū)里面 還留有一個/n,第二個scanf讀取這個/n。然后輸入b和第二個回車,同樣的,第三個scanf讀取了b,第四個 scanf讀取了第二個回車符。第五個讀取了c。所以五個scanf都執(zhí)行了,并沒有提前結(jié)束。只不過有的scanf 讀取到了回車符而已。

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

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

      {

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

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

      }

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

      #include

      main()

      C語言scanf函數(shù)詳細(xì)解釋

      {

      char c[5];

      gets(c);

      printf(c);

      return 0;

      }

      但要注意:這個函數(shù)自動把你最后敲的回車轉(zhuǎn)換為字符 '/0 '。如果你的輸入超過了數(shù)組的大小,那么就會產(chǎn) 生錯誤。

      C 語言

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:【題集】一維前綴和-二維前綴和-數(shù)星星問題-反復(fù)運行時如何降低時間復(fù)雜度
      下一篇:Java 設(shè)計模式之工廠模式
      相關(guān)文章
      亚洲无线码在线一区观看| 亚洲综合AV在线在线播放| 久久精品国产亚洲AV无码麻豆| 国外亚洲成AV人片在线观看| 亚洲成A人片77777国产| 国产亚洲一卡2卡3卡4卡新区 | 国产亚洲一卡2卡3卡4卡新区| 亚洲国产成人AV在线播放| 中文字幕亚洲精品无码| 亚洲综合久久一本伊伊区| 亚洲国产精品综合久久20| tom影院亚洲国产一区二区| 亚洲精品国产精品国自产网站 | 中文字幕亚洲专区| 中文字幕亚洲乱码熟女一区二区| 久久乐国产精品亚洲综合| 国产亚洲精品自在线观看| 亚洲人成亚洲人成在线观看| 国产亚洲精品精华液| 亚洲av鲁丝一区二区三区| 亚洲综合日韩中文字幕v在线 | 亚洲视频欧洲视频| 亚洲国产片在线观看| 激情综合亚洲色婷婷五月| 亚洲一区二区三区乱码在线欧洲| 亚洲色欲色欲www在线播放| 亚洲日韩精品无码AV海量| 激情无码亚洲一区二区三区 | 亚洲人妻av伦理| 亚洲国产精品一区二区成人片国内 | 亚洲乱码卡三乱码新区| 亚洲一区二区三区写真 | 色播亚洲视频在线观看| 亚洲小说区图片区| 亚洲中文字幕无码爆乳app| 日韩欧美亚洲中文乱码| 亚洲视频人成在线播放| 亚洲va久久久噜噜噜久久天堂| 精品亚洲aⅴ在线观看| 久久精品国产亚洲αv忘忧草| 亚洲国产成人久久精品软件|