• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 19,  comments - 21,  trackbacks - 0

            一、序言                          

                scanf()函數是所有C語言學習者在學習C語言過程中所遇到的第二個函數(第一個函數是printf(),Brian W.Kerninghan & Dennis M.Ritchie的“hello,world”程序基本上是所有的C語言學習者第一個范例),所以scanf()函數應當是C學習者能熟練運用的一個函數,但有很多初學者對此函數不能很好的運用,在實際編程中錯誤使用scanf()函數,導至程序產生某種錯誤不能正常運行,以至產生“scanf()函數有BUG”,“scanf()函數無用論”等等錯誤觀點。
                本文結合筆者在編程實踐中及論壇上網友所遇到的問題作一釋疑,但筆者水平有限(菜鳥級),難免有謬誤之處,還望達人指點一二。(Email:knocker.k@126.com)
                本文分上,下兩篇講述了C語言中的scanf()函數的用法,重點闡述使用scanf()函數過程中出現的常見錯誤及對策。當然,文中某些解決方法,均可以采用其他函數和方法來更好地解決,但本文僅限討論scanf()函數本身。
                上篇,詳細介紹了scanf()函數控制串的構成。下篇,用實際例程介紹scanf()函數控制串運用出現的常見錯誤及對策技巧。

            二、scanf()函數的控制串

            函數名: scanf
            功  能: 執行格式化輸入
            用  法: int scanf(char *format[,argument,...]);

            scanf()函數是通用終端格式化輸入函數,它從標準輸入設備(鍵盤) 讀取輸入的信息。可以讀入任何固有類型的數據并自動把數值變換成適當的機內格式。

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

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

            其控制串由三類字符構成:

            1。格式化說明符;
            2。空白符;
            3。非空白符;


            (A)                格式化說明符


            格式字符           說明

            %a                 讀入一個浮點值(僅C99有效)
            %A                 同上
            %c                 讀入一個字符
            %d                 讀入十進制整數
            %i                 讀入十進制,八進制,十六進制整數
            %o                 讀入八進制整數
            %x                 讀入十六進制整數
            %X                 同上
            %c                 讀入一個字符
            %s                 讀入一個字符串
            %f                 讀入一個浮點數
            %F                 同上
            %e                 同上
            %E                 同上
            %g                 同上
            %G                 同上
            %p                 讀入一個指針
            %u                 讀入一個無符號十進制整數
            %n                 至此已讀入值的等價字符數
            %[]                掃描字符集合
            %%                 讀%符號
                            
            附加格式說明字符表

            修飾符                       說明

            L/l 長度修飾符               輸入"長"數據
            h 長度修飾符                 輸入"短"數據
            W 整型常數                   指定輸入數據所占寬度
            * 星號                       空讀一個數據
            hh,ll同上h,l但僅對C99有效。


            (B)         空白字符

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

            (C)        非空白字符

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


            注:scanf()控制串知識就介紹到這里(應該比較齊全了^_^),如有遺漏下次補上。下面將結合實際例程,一一闡述.

            三、scanf()函數的控制串的使用

            例1.

            #include "stdio.h"
            int main(void)
            {
              int a,b,c;
              
              scanf("%d%d%d",&a,&b,&c);  
              printf("%d,%d,%d\n",a,b,c);  

              return 0;
            }  

            運行時按如下方式輸入三個值:

            3□4□5 ↙(輸入a,b,c的值)

            3,4,5 (printf輸出的a,b,c的值)

               (1) &a、&b、&c中的&是地址運算符,分別獲得這三個變量的內存地址。
               (2) "%d%d%d"是按十進值格式輸入三個數值。輸入時,在兩個數據之間可以用一個或多個空格、tab鍵、回車鍵分隔。
                  以下是合法輸入方式:
                  ① 3□□4□□□□5↙
                  ② 3↙
                     4□5↙
                  ③ 3(tab鍵)4↙
                     5↙


            例2.

            #include "stdio.h"
            int main(void)
            {
              int a,b,c;

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

              return 0;
            }  

            運行時按如下方式輸入三個值:

            3,4,5 ↙(輸入a,b,c的值)

            或者

            3,□4,□5 ↙(輸入a,b,c的值)

            3,□□□4,□5 ↙(輸入a,b,c的值)
            ......
            都是合法的,但是","一定要跟在數字后面,如:
            3□,4,□5 ↙就非法了,程序出錯。(解決方法與原因后面講)

            再如:

            1、sacnf()中的變量必須使用地址。

                     int a, b;
            scanf("%d%d",a,b); //錯誤
            scanf("%d%d",&a,&b);

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

            例:
            scanf("%d,%d",&a,&b);
            輸入: 3,4 ↙(逗號與"%d,%d"中的逗號對應)
            scanf("a=%d,b=%d",&a,&b);
            輸入: a=3,b=4 ↙("a=","b=",逗號與"%d,%d"中的"a=","b="及逗號對應)


            3、在用"%c"輸入時,空格和“轉義字符”均作為有效字符。

            例:
            scanf("%c%c%c",&c1,&c2,&c3);
            輸入:a□b□c↙
            結果:a→c1,□→c2,b→c3 (其余被丟棄)


            scanf()函數接收輸入數據時,遇以下情況結束一個數據的輸入:(不是結束該scanf函數,scanf函數僅在每一個數據域均有數據,并按回車后結束)。
                    ① 遇空格、“回車”、“跳格”鍵。
                    ② 遇寬度結束。
                    ③ 遇非法輸入。


                上篇就寫到這里吧,第三小節的例程"抄"自網上的一個教程(原因有二:一,可以少打不少字。二,□↙我不知道怎么打。^_^),并刪去其中的錯誤之處.這里也順便提醒本文讀者一句:凡事要親力而為,即使是經典的書籍也不免有疏漏之處,所以,用編譯器說話是最可靠的,是對是錯請編譯器告訴你。

            posted on 2005-12-26 17:11 halCode 閱讀(487) 評論(0)  編輯 收藏 引用 所屬分類: 算法/數據結構

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(7)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            相冊

            編程資源

            不務正業

            找工作

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            国产成人精品综合久久久| 色诱久久久久综合网ywww| 91精品国产高清久久久久久国产嫩草| 久久久久国产精品熟女影院| 人人狠狠综合久久亚洲婷婷| 污污内射久久一区二区欧美日韩| 久久人人爽人人爽人人片AV高清| 久久精品水蜜桃av综合天堂| 久久国产精品无码网站| 少妇高潮惨叫久久久久久| 99久久无码一区人妻| 一本色道久久99一综合| 精品免费tv久久久久久久| 亚洲精品无码久久不卡| 99re久久精品国产首页2020| yy6080久久| 国产精品久久影院| 日韩精品久久久久久免费| 久久精品国产精品亚洲人人 | 国产精自产拍久久久久久蜜| 2021国产精品久久精品| 香蕉久久夜色精品国产小说| 色诱久久久久综合网ywww| 伊人精品久久久久7777| 久久国产免费直播| 伊人久久综合热线大杳蕉下载| 日韩精品久久久肉伦网站| 狠狠色丁香婷婷久久综合| 狠狠色伊人久久精品综合网| 91精品国产色综合久久| 蜜臀av性久久久久蜜臀aⅴ| 欧美日韩精品久久久免费观看| 久久人妻少妇嫩草AV蜜桃| 国产ww久久久久久久久久| 91精品国产91久久| 国产免费福利体检区久久| 国产成人精品久久| 久久久久无码中| 亚洲伊人久久成综合人影院| 免费一级欧美大片久久网| 伊人久久一区二区三区无码|