• <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 閱讀(485) 評論(0)  編輯 收藏 引用 所屬分類: 算法/數據結構

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(7)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            相冊

            編程資源

            不務正業

            找工作

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            色综合久久久久综合99| 精品久久久久国产免费| 日本人妻丰满熟妇久久久久久| 亚洲精品国产字幕久久不卡| 一本色道久久88综合日韩精品| 久久人妻少妇嫩草AV蜜桃| 欧美日韩成人精品久久久免费看| 久久久久亚洲精品男人的天堂| 国产亚洲美女精品久久久| 久久久久国产成人精品亚洲午夜| 欧美精品国产综合久久| 久久午夜羞羞影院免费观看| 久久国产精品一区二区| 中文字幕无码久久精品青草| 2021精品国产综合久久| 要久久爱在线免费观看| 久久精品无码专区免费东京热| 久久93精品国产91久久综合| 丁香色欲久久久久久综合网| 99久久国产综合精品五月天喷水| 18禁黄久久久AAA片| 免费观看久久精彩视频| 久久久久成人精品无码中文字幕 | 久久综合久久鬼色| 亚洲国产精品无码久久一线| 久久精品无码一区二区三区日韩| 无码人妻久久一区二区三区| 国产99久久久国产精免费| 亚洲va国产va天堂va久久| 久久久久亚洲精品无码网址| 日韩欧美亚洲综合久久影院d3| 久久精品a亚洲国产v高清不卡| 香蕉aa三级久久毛片| 精品久久久久久国产91| 色婷婷综合久久久久中文| 狠狠色噜噜色狠狠狠综合久久| 久久人人爽人人人人片av| 伊人 久久 精品| 久久久网中文字幕| 久久久久国产一区二区三区| 久久久久久国产精品免费免费|