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

             

            摘要:

            本文闡述了基于ANSIWin 95Win NT上的 C/C++語言中scanf()函數的用法,以及在實際使用中常見錯誤及對策。

            關鍵詞

            scanf()

             

            一、             序言

            CSDN論壇的C/C++版塊,我時常見到“對于scanf()函數的用法、及出現的各種錯誤而迷惑”的帖子,萌發了我寫這篇文章的念頭。文中結合自身在學習和編程中對它的認識和體會,以具體示例闡述問題,目的在于使得初學者能夠正確使用scanf()函數,少走不必要的彎路。

            二、             scanf()函數的用法

            scanf()函數是格式化輸入函數,它從標準輸入設備(鍵盤) 讀取輸入的信息。

             

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

             

            格式化字符串包括以下三類不同的字符;

            1、  格式化說明符:

            格式化說明符與printf()函數中的格式說明符基本相同。但和printf()函數中格式字符串的用法有一些小區別。我們來看下面這個表。
             

            格式字符

            說明

            %d

            從鍵盤輸入十進制整數

            %o

            從鍵盤輸入八進制整數

            %x

            從鍵盤輸入十六進制整數

            %c

            從鍵盤輸入一個字符

            %s

            從鍵盤輸入一個字符串

            %f

            從鍵盤輸入一個實數

            %e

            %f的作用相同

            附加格式說明字符表

            字符

            說明

            L

            輸入"長"數據

            H

            輸入"短"數據

            M

            指定輸入數據所占寬度

            *

            空讀一個數據

             

            2、    空白字符: 空白字符會使scanf()函數在讀操作中略去輸入中的一個或多個空白字符。

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

             

            地址表是需要讀入的所有變量的地址,而不是變量本身。這與printf()函數完全不同,要特別注意。各個變量的地址之間同","分開。

            例如:

            #include <stdio.h>

            void main()

            {

                   int i, j;

                   printf("i, j=?\n");

                   scanf("%d, %d", &i, &j);

            }

            上例中的scanf()函數先讀一個整型數,然后把接著輸入的逗號剔除掉,最后讀入另一個整型數。如果","這一特定字符沒有找到,scanf()函數就終止。若參數之間的分隔符為空格,則參數之間必須輸入一個或多個空格。

            說明:

            (1)          對于字符串數組或字符串指針變量,由于數組名和指針變量名本身就是地址,因此使用scanf()函數時,不需要在它們前面加上"&"操作符。

            例如:

            #include <stdio.h>

            void main()

            {

                   char *p, str[20];

                  

                            p = new char[20];

                           

                      scanf("%s", p); /*從健盤輸入字符串*/

                      scanf("%s", str);

                      printf("%s\n", p); /*向屏幕輸出字符串*/

                      printf("%s\n", str);

            }

             

            (2)          可以在格式化字符串中的"%"各格式化規定符之間加入一個整數,表示任何讀操作中的最大位數。

            如上例中若規定只能輸入10字符給字符串指針p,則第一條scanf() 函數語句變為:scanf("%10s", p);

            程序運行時一旦輸入字符個數大于10p就不再繼續讀入,而后面的一個讀入函數即scanf("%s", str)就會從第11個字符開始讀入。

            (3)             scanf()函數中沒有精度控制。

            如: scanf("%5.2f",&a); 是非法的。不能企圖用此語句輸入小數為2位的實數。

            (4)             scanf中要求給出變量地址,如給出變量名則會出錯

            scanf("%d",a);是非法的,應改為scnaf("%d",&a);才是合法的。

            (5)          在輸入多個數值數據時,若格式控制串中沒有非格式字符作輸入數據之間的間隔則可用空格,TAB或回車作間隔。

            C編譯在碰到空格,TAB,回車或非法數據(如對“%d”輸入“12A”時,A即為非法數據)時即認為該數據結束。

            (6)          在輸入字符數據(%c)時,若格式控制串中無非格式字符,則認為所有輸入的字符均為有效字符。

            例如:scanf("%c%c%c",&a,&b,&c);

            輸入為:

            d e f

            則把'd'賦予a, ' (空格)'賦予b,'e'賦予c。因為%c 只要求讀入一個字符,后面不需要用空格作為兩個字符的間隔,因此把' '作為下一個字符送給b

            只有當輸入為:def 時,才能把'd'賦于a,'e'賦予b,'f'賦予c 如果在格式控制中加入空格作為間隔,

            scanf ("%c %c %c",&a,&b,&c);則輸入時各數據之間可加空格。

            我們用一些例子來說明一些規則:

            #include <stdio.h>

            void main()

            {

                   char a,b;

                   printf("input character a,b\n");

                   scanf("%c%c",&a,&b);  /*注意兩個%c之間沒有任何符號*/

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

            }

            由于scanf函數"%c%c"中沒有空格,輸入M N,結果輸出只有M。而輸入改為MN時則可輸出MN兩字符,見下面的輸入運行情況: input character a,b

            MN    (你輸入的值)

            MN    (屏幕上顯示的值)

            #include <stdio.h>

            void main()

            {

                   char a,b;

                   printf("input character a,b\n");

                   scanf("%c %c",&a,&b); /*注意兩個%c之間有個空格*/

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

            }本例表示scanf格式控制串"%c %c"之間有空格時, 輸入的數據之間可以有空格間隔。

            (7)             如果格式控制串中有非格式字符則輸入時也要輸入該非格式字符。

            例如:

            scanf("%d,%d,%d",&a,&b,&c); 其中用非格式符“ , ”作間隔符,故輸入時應為: 5,6,7 (scanf 雙引號之間的格式必須一樣)

            又如: scanf("a=%d,b=%d,c=%d",&a,&b,&c);

            則輸入應為 a=5,b=6,c=7

            如輸入的數據與輸出的類型不一致時,雖然編譯能夠通過,但結果將不正確。

             

            #include <stdio.h>

            void main()

            {

                   int a;

                   printf("input a number");

                   scanf("%d",&a);

                   printf("%ld",a);

            }

            由于輸入數據類型為整型, 而輸出語句的格式串中說明為長整型,因此輸出結果和輸入數據不符。輸出并不是輸入的值。

            如將Scanf("%d",&a); 語句改為 scanf("%ld",&a);

            輸入數據為長整型,輸入輸出數據才相等。

            三、             常見錯誤及對策

            問題1

            我初學C程序,所以提的問題很淺,希望您不要見笑。我自己編了一個程序,但運行的結果與我預期的不一樣。

            #include<stdio.h>

            void  main()

            {

                   static int a[2][3]={{1,3,4},{7,9,6}};

                   int i,j,k;

                   for(k=1;k<=2;k++)

                   {printf("Please input num:");

                   scanf("%d %d",&i,&j);

                   if(i<2&&j<3)

                          printf("num=%d\n",a[i][j]);

                   else printf("Input is error,\n");

                   }

                   printf("programm is complete.\n");

            }

            我想將第8行改為

            scanf("i=%d j=%d",&i,&j);

            則程序運行結果變成

            please input num:i=1 j=2

            num=6

            num=6(我原本希望能重復第一行再讓我輸入)

            Programm is complete.

            為什么第二次不能輸入?

            答復:

            我使用Turbo C 2.0證實存在你說的問題。象scanf("i=%d j=%d",&i,&j);這樣的輸入方式比較特別,TC 2.0顯然在第一次輸入后沒有象正常情況一樣清楚輸入緩沖區,這樣第二次執行scanf時,程序并沒有讓你輸入而是直接讀入上次輸入的結果。如果你一定要這么做,應該在scanf之前加上:

            fflush(stdin);

            這樣清楚掉鍵盤緩沖區。

             

            問題2

            為什么要把scanf("%c",varname)一定改成scanf(" %c")才可以正確接收字符?

            答復:

            類似上題,在%c的前面必須有一個空格,否則系統會將你前面輸入別的值之后鍵入的回車符讀入該變量,造成死循環。當然,如果scanf("%c",&varname)是第一條讀入語句,就可以不需要空格。

             

            問題3(輸入變量時忘記加地址運算符“&”)

            int a,b;

            scanf("%d%d",a,b);

            答復:

            這是不合法的。Scanf函數的作用是:按照ab在內存的地址將ab的值存進去。“&a”指a在內存中的地址。

             

            問題4(輸入數據的方式與要求不符)

            scanf("%d%d",&a,&b);

            輸入時,不能用逗號作兩個數據間的分隔符,如下面輸入不合法:

            34

            輸入數據時,在兩個數據之間以一個或多個空格間隔,也可用回車鍵,跳格鍵tab

            scanf("%d,%d",&a,&b);

            C規定:如果在“格式控制”字符串中除了格式說明以外還有其它字符,則在輸入數據時應輸入與這些字符相同的字符。下面輸入是合法的:

            34

            此時不用逗號而用空格或其它字符是不對的。

            3 4 34

            又如:

            scanf("a=%d,b=%d",&a,&b);

            輸入應如以下形式:

            a=3,b=4

             

            問題5(輸入字符的格式與要求不一致)

            在用“%c”格式輸入字符時,“空格字符”和“轉義字符”都作為有效字符輸入。

            scanf("%c%c%c",&c1,&c2,&c3);

            如輸入a b c

            字符“a”送給c1,字符“ ”送給c2,字符“b”送給c3,因為%c只要求讀入一個字符,后面不需要用空格作為兩個字符的間隔。

             

            問題6.輸入輸出的數據類型與所用格式說明符不一致)

            例如,a已定義為整型,b定義為實型

            a=3;b=4.5;

            printf("%f%d\n",a,b);

            編譯時不給出出錯信息,但運行結果將與原意不符。這種錯誤尤其需要注意。

             

            問題7(輸入數據時,企圖規定精度)

            scanf("%7.2f",&a);

            這樣做是不合法的,輸入數據時不能規定精度。

             

            問題8(在不應加地址運算符&的位置加了地址運算符)

            scanf("%s",&str);

            C語言編譯系統對數組名的處理是:數組名代表該數組的起始地址,且scanf函數中的輸入項是字符數組名,不必要再加地址符&。應改為:scanf("%s",str);

            四、             結論

            本文主要講述了C/C++中的scanf()函數的用法,重點闡述使用scanf()函數過程中出現的常見錯誤及對策。當然,文中某些解決方法,均可以采用其他函數和方法來更好地解決,但本文僅限討論scanf()函數本身。文中難免存在一些不足之處,歡迎讀者批評指正。

            posted on 2005-11-25 22:19 halCode 閱讀(1028) 評論(0)  編輯 收藏 引用 所屬分類: 算法/數據結構

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

            常用鏈接

            留言簿(7)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            相冊

            編程資源

            不務正業

            找工作

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品无码专区免费 | 国产精品一区二区久久| 久久这里有精品| 亚洲日本va午夜中文字幕久久| 久久亚洲国产成人影院| 日本高清无卡码一区二区久久| 久久婷婷色综合一区二区| 久久久久久久久久久久久久| 青青草原综合久久大伊人| 国产成人久久AV免费| 99久久国产综合精品成人影院| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久午夜无码鲁丝片秋霞| 波多野结衣久久一区二区| 久久青青色综合| 久久人人爽爽爽人久久久| 久久精品免费一区二区三区| 久久99精品久久久久久| 免费观看成人久久网免费观看| 亚洲精品无码久久不卡| 国产69精品久久久久APP下载| 亚洲AV无码一区东京热久久| 天天久久狠狠色综合| 国产亚州精品女人久久久久久 | 久久久久久亚洲AV无码专区| 国产亚洲精久久久久久无码AV| 久久精品亚洲欧美日韩久久| 亚洲精品国产第一综合99久久| 日韩人妻无码一区二区三区久久| 久久国产精品一国产精品金尊| 久久综合九色综合久99| 无码人妻少妇久久中文字幕| 性欧美丰满熟妇XXXX性久久久| 久久国产精品-久久精品| 久久久噜噜噜久久| 久久99精品久久久久久噜噜| 色老头网站久久网| 久久久青草久久久青草| 伊人久久大香线蕉亚洲五月天 | 亚洲精品97久久中文字幕无码| 精品久久久久久国产潘金莲|