• <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>
            隨筆-145  評論-173  文章-70  trackbacks-0
            當讀入發生錯誤,或者是到達文件尾,scanf就會返回EOF這個宏的值。
            while(scanf("%d%d",&a,&b)!=EOF),這個語句就是說,當讀取沒有到達文件尾的話,就不停的讀取。
            scanf 函數的返回值反映的是按照指定的格式符正確讀入的數據的個數。如果輸入數據與指定格式不符,則會產生輸入錯誤。遇到輸入錯誤,scanf函數會立即終止,返回已經成功讀取的數據的個數。所以,通過scanf函數的返回值和指定輸入數據的個數(由格式符決定)的比較,可以判斷數據輸入是否成功。

            scanf("%d%d",&a,&b); 這個語句會去讀兩個整型到a, b。如果讀取成功,應該返回2。就是它成功讀取變量的個數。


            論壇上很多人對scanf的不太了解,導致程序出錯,我想把scanf的具體用法貼出來,希望大家可以共同進步,有什么不對的地方可以提出來。
            int scanf(char *format,...);
            這應該是scanf的標準形式。先說說關于他的返回值的問題。
            庫函數幾乎都是有返回值的,有些人可能很奇怪,怎么很少人用過scanf的返回值呢?
            scanf會返回成功接收到的變量數量的值。比如scanf("%d",&j"),與scanf("%d=",&j),如果接受成功的話返回值都是1
            我用如下語句作了測試
            #include <stdio.h>
            int main (){
                int j;
                printf ("%d",scanf("%d\n",&j));
                return 0;
            }
            如果你開始就輸入回車,程序會繼續等待你輸入,因為在輸入數字的時候,scanf會跳過空白字符。(the c programming language 上說,scanf實際上是用getchar()接受由數字組成的字符串,再轉換成數字)
            如果我輸入ctrl-z(unix上是ctrl-d)則會返回-1(隨編譯器而定).這實際上就是常量EOF的值,也就是所謂的返回eof
            如果我鍵入的不是數字返回值就是0。但是如果我輸入浮點數,又會怎么樣呢?
            我舉的例子中同樣會返回1,但是緩沖區會留下垃圾,如果是scanf("%d%d",&a,&b);則會出錯。
            這是可以使用一個庫函數fflush(stdin)來清除緩沖。不過貌似雨中飛燕大姐說這個用法是非標準的。K&R,只是說行為沒有定義,但我們可以使用while((c=getchar())!='\n'&&c!=EOF);同樣可以清除后面的垃圾
            scanf的格式匹配還是比較簡單,一定要記住的就是普通變量一定要加上&,否則編譯器無法檢測錯誤,但運行肯定會段錯誤。
                ┏━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
                ┃ 代  碼 │             意                          義            
                ┠────┼────────────────────────────┨
                ┃   %a   │讀浮點值(僅適用于 C99)                                 
                ┃   %A   │讀浮點值(僅適用于 C99)                                 
                ┃   %c   │讀單字符                                                
                ┃   %d   │讀十進制整數                                            
                ┃   %i   │讀十進制、八進制、十六進制整數                          
                ┃   %e   │讀浮點數                                                
                ┃   %E   │讀浮點數                                                
                ┃   %f   │讀浮點數                                                
                ┃   %F   │讀浮點數(僅適用于 C99)                                 
                ┃   %g   │讀浮點數                                                
                ┃   %G   │讀浮點數                                                
                ┃   %o   │讀八進制數                                             
                ┃   %s   │讀字符串                                                
                ┃   %x   │讀十六進制數                                            
                ┃   %X   │讀十六進制數                                            
                ┃   %p   │讀指針值                                                
                ┃   %n   │至此已讀入值的等價字符數                                
                ┃   %u   │讀無符號十進制整數                                      
                ┃  %[ ]  │掃描字符集合                                            
                ┃   %%   │讀 % 符號(百分號)                                       
                ┗━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
            前面都很簡單,%p,%n很少用到,跳過。要輸入%必須要在前面再加一個%,
            重點來談談%s和%[]。%s是讀入一個數組,他與gets的區別就在于%s會以任何的空字符結束,而gets是回車結束。
            同樣%s前可以加數字,表示只讀多少個。
            ANSI C 標準向 scanf() 增加了一種新特性,稱為掃描集(scanset)。 掃描集定義一個字符集合,可由 scanf() 讀入其中允許的字符并賦給對應字符數組。 掃描集合由一對方括號中的一串字符定義,左方括號前必須綴以百分號。 例如,以下的掃描集使 scanf() 讀入字符 A、B 和 C:
                %[ABC]
            使用掃描集時,scanf() 連續吃進集合中的字符并放入對應的字符數組,直到發現不在集合中的字符為止(即掃描集僅讀匹配的字符)。返回時,數組中放置以 null 結尾、由讀入字符組成的字符串。
            對于許多實現來說,用連字符可以說明一個范圍。 例如,以下掃描集使 scanf() 接受字母 A 到 Z:
            %[A-Z]
            重要的是要注意掃描集是區分大小寫的。因此,希望掃描大、小寫字符時,應該分別說明大、小寫字母。
            對于%[]還可以用^+任意字符(包括eof)來結束字符串的輸入。比如%[^EOF]就是直到有EOF輸入,字符串才中止。
            但一定要記住就是c語言是緩沖輸入,即使你%[^a],再你輸入回車之前輸入多少的a都是不可能結束的。
            %s的輸入會跳過空白字符,但是%c則不會。
            這也就是
            scanf("%d",&h);
            scanf("%c",&c);
            如果這寫的話,變量c放的一定是回車。
            如果想實現這種輸入,可以在兩個語句之間加入一個getchar(),他可以吃掉這個回車,
            也可用scanf("%d %c",&h,&c);來做,再輸入數字后加一個空格。就可以了
            但千萬別用scanf("%d\n",&h)!!!!!!!!k&r說的十分清楚,任何非格式化的字符都需要完全匹配。
            意味著,只有輸入數字后面再加\n才是合法的。
            還有就是*加在任何項的前面表示該項不符值,別的就沒什么好說的了
            posted on 2009-11-27 21:21 deercoder 閱讀(1039) 評論(0)  編輯 收藏 引用 所屬分類: C/C++
            欧美粉嫩小泬久久久久久久| 精品久久久久久国产三级| 久久精品成人欧美大片| 久久久噜噜噜久久中文福利| 狠狠久久亚洲欧美专区 | 中文精品久久久久人妻不卡| 久久午夜伦鲁片免费无码| 国产一区二区精品久久岳| 久久91精品国产91久| 久久精品九九亚洲精品天堂| 色婷婷久久久SWAG精品| 久久精品国产亚洲麻豆| 国产精品99久久久精品无码| 青青青国产成人久久111网站| 午夜精品久久久久久影视riav| 国产精品一区二区久久国产| 久久中文字幕精品| 久久青青草原国产精品免费 | 精品久久久噜噜噜久久久| 日韩欧美亚洲综合久久影院Ds| 精品无码久久久久国产| 怡红院日本一道日本久久 | 欧美久久天天综合香蕉伊| 1000部精品久久久久久久久| 四虎亚洲国产成人久久精品| 久久综合九色综合欧美狠狠| 亚洲综合精品香蕉久久网| 欧洲国产伦久久久久久久 | 国产精品99久久久精品无码| 久久久久九国产精品| 91精品观看91久久久久久| 国产成年无码久久久久毛片| 日韩人妻无码精品久久免费一 | 99久久国产综合精品网成人影院 | 伊人久久大香线焦AV综合影院| 久久亚洲色一区二区三区| 国产精品免费久久| 久久综合欧美成人| 国产午夜精品久久久久九九| 国内精品久久久久久不卡影院 | 久久这里有精品|