• <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)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            相冊

            編程資源

            不務正業

            找工作

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            色综合久久综合网观看| 久久久久久狠狠丁香| 国产精品久久久久久久久久影院 | 亚洲精品tv久久久久久久久久| 久久无码精品一区二区三区| 四虎国产精品成人免费久久| 狠狠色婷婷久久综合频道日韩| 97久久国产亚洲精品超碰热 | 情人伊人久久综合亚洲| 亚洲午夜无码AV毛片久久| 三上悠亚久久精品| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 色欲久久久天天天综合网| 久久久久夜夜夜精品国产| 伊人久久国产免费观看视频| 久久99毛片免费观看不卡| 伊人色综合九久久天天蜜桃| 久久91精品国产91久久麻豆| 中文字幕亚洲综合久久菠萝蜜| 久久精品成人免费看| 亚洲午夜久久久久久噜噜噜| 手机看片久久高清国产日韩| 亚洲国产精品一区二区久久| 无码AV中文字幕久久专区| 久久国产精品无| 久久久精品人妻无码专区不卡| 久久综合综合久久97色| 久久久精品久久久久影院| 久久99国产精品久久99| 69久久精品无码一区二区| 亚洲国产精品一区二区久久hs | av无码久久久久不卡免费网站| 2021国内久久精品| 国产精品乱码久久久久久软件| 国产精品午夜久久| 国产成人香蕉久久久久| 99久久精品免费国产大片| 日本精品久久久中文字幕| 国产精品欧美久久久久天天影视| 天天爽天天爽天天片a久久网| 秋霞久久国产精品电影院|