官术网_书友最值得收藏!

3.3.3 數據的輸入函數

1.getchar函數

getchar函數的功能是從鍵盤上輸入一個字符,其一般形式為:

            getchar();

通常把輸入的字符賦予一個字符變量,構成賦值語句,例如:

            char c;
            c=getchar();

使用該函數前必須要用文件包含命令:#include<stdio.h>或 #include "stdio.h"。

【例3.3】 getchar函數的用法。

程序如下:

            1   #include<stdio.h>
            2   void main()
            3   {
            4       char c;
            5       printf("input a character\n");
            6       c=getchar();
            7       putchar(c);
            8   }

程序的運行結果如下:

            input a character
            >a ↙
            a

程序的第5行是輸入提示,用來在顯示器上顯示一條信息,告訴使用程序的人該如何做。建議讀者在編程時注意使用這一方法。程序的第6行利用getchar函數從鍵盤上輸入一個字符,并賦給字符變量c。程序運行時,顯示一個光標,用戶輸入的字符(這里是字母“a”)將顯示在光標位置(參見運行結果的第2 行),當用戶按回車鍵時,獲得輸入的字符,結束getchar函數的調用,并把結果賦給變量c。程序的第7行利用putchar函數將字符變量c的值顯示在屏幕上。

應該注意的是,getchar函數只能接受單個字符,輸入多于一個字符時,只接收第一個字符。這是因為,getchar函數是從鍵盤緩沖區中讀取字符數據的,用戶輸入的字符暫時存在鍵盤緩沖區中,形成一個序列。每調用一次getchar函數,將順序讀取一個字符,其他字符還將保留在緩沖區中。

【例3.4】 用getchar函數讀取多個字符。

程序如下:

            1   #include<stdio.h>
            2   void main()
            3   {
            4       char c;
            5       printf("input some characters\n");
            6       c=getchar();
            7       putchar(c);
            8       c=getchar();
            9       putchar(c);
            10      c=getchar();
            11      putchar(c);
            12  }

程序的運行結果可能是:

            input some characters
            abcd ↙             (這里連續輸入4個字符)
            abc                 (僅顯示3個字符,且連續輸出)

程序中(第6~11行),getchar函數和putchar函數是交替使用的,但上面的運行結果顯示的輸入和輸出卻是分別進行的,為什么?請讀者自己體會個中的緣由。讀者不妨嘗試一下其他不同的輸入方法,觀察結果有什么不同。

需要注意的是,使用getchar函數可以輸入任意字符,包括空格、Tab鍵、回車等控制字符。

2.scanf函數

(1)scanf函數的調用方法

scanf函數的一般形式為:

            scanf(格式控制,地址表列);

其中,“格式控制”的含義同printf函數,“地址表列”是由若干個內存地址組成的表列,可以是變量的地址,也可以是字符串的首地址,等等。

對于變量v,其地址可以用&v表示,其中“&”是地址運算符(詳見第7章)。

這里需要讀者特別注意,scanf函數的參數除了第一個參數是“格式控制”字符串外,其他都是變量的地址,不是變量名稱,這不同于其他程序設計語言。對于一般變量,出現在scanf函數參數中時,通常需要加地址運算符“&”。但有些參數本身就是地址,也就不需要加地址運算符了,比如用指針變量作為參數。

例如:

            int a,b,c;
            scanf("%d%d%d",&a,&b,&c); /* &a、&b、&c分別代表變量a、b、c在內存中的地址*/
            printf("%d%d%d\n",a,b,c);

運行時輸入:

            >1  2  3 ↙

則輸出結果為:

            123

程序中scanf函數的作用是,將用戶輸入地數據(這里是1、2、3三個整數,存放在鍵盤緩沖區中)按順序存入變量a、b、c在內存中的存儲單元(用地址指定)中。格式控制“%d%d%d”表示按十進制整數形式輸入3個整數。輸入這3個數據時,可以用一個或多個空格將它們隔開,也可以用回車鍵和跳格鍵(即Tab)作為分隔符。

對于這段程序,下面的輸入方式都是合法的:

① 1 _ 2 _ _ _ _ 3 ↙

② 1 ↙

2↙

3↙

③ 1 → 2 _ _ 3 ↙“→”代表Tab鍵,下同。

再看一個輸入實型和字符型數據的例子:

            float x,y,z;
            char c1,c2;
            scanf("%f%f%f",&x,&y,&z);
            scanf("%c%c",&c1,&c2);

可以按如下形式輸入數據:

            1.0   2   .3 ↙         (小數的輸入比較自由)
            ab ↙

其中,“%f”用來輸入實型數據,輸入多個實數時同樣可以使用空格、回車鍵和Tab鍵作為分隔符。“%c”用來輸入一個字符型數據,輸入多個字符時不需要任何分隔符,連續輸入即可。

(2)scanf函數的輸入格式控制

與printf函數不同,scanf函數的格式控制字符串中,所有項目都是要求用戶在運行程序時輸入的,包括與格式說明對應的數據和普通字符。

例如,對于如下程序段(假設x、y都是整型的):

            printf("input data here:\n");
            scanf("x=%d",&x);
            scanf("y=%d",&y);
            printf("x=%d,y=%d\n",x,y);

運行時的輸入、輸出是:

            input data here:
            x=123 ↙
            y=456 ↙
            x=123,y=456

如果不輸入“x=”、“y=”,程序就會出錯。因此,通常不在scanf函數的“格式控制”中使用“普通字符”,以避免輸入困難。

而與printf函數中的格式說明類似,scanf函數的格式說明也以“%”開始,以一個格式字符結束,中間可以插入附加格式說明字符。表3.3列出了scanf函數所用到的格式字符,表3.4列出了scanf函數可以使用的附加格式說明字符。

表3.3 scanf函數的格式字符

表3.4 scanf函數的附加格式說明字符

說明:

① C語言中,要連續輸入2個以上的數據,一般使用空白(即空格、Tab鍵或回車鍵)作為分隔符。但有的人習慣使用逗號“,”分隔數據,為此,可以在scanf函數的“格式控制”字符串中,用逗號分隔對應的格式說明,例如:

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

輸入時,應采用如下形式:

            1,2 ↙

注意,1后面是逗號,它與scanf函數中格式控制中的逗號相對應。如果輸入時不用逗號而用空格或其他字符,將不能輸入正確的數據。

反過來,如果“格式控制”字符串中沒有出現逗號分隔符,輸入時用逗號分隔也是錯誤的。因此,一個好的習慣是,在程序中用提示信息提醒用戶該如何輸入數據。例如:

            printff("輸入用逗號分開的兩個整數\n");
            scanf("%d,%d",&a,&b);

② 用“%c”輸入字符時,空格、Tab、回車及其他控制字符都可以作為有效字符輸入。因此,對于:

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

如果輸入:

            a  b  c ↙          (3個字母間各有一個空格)

則字符'a'送給變量c1,' '(空格)送給變量c2,'b'送給變量c3。

由于c格式符的特殊性(其他格式符都把空白看做數據的分隔符,而不會讀取空白),使用scanf時,最好不要將c格式符與其他格式符混合使用,以免造成輸入錯誤。

③ 在輸入數據時,遇到以下情況則認為該數據結束。

● 遇到空格、回車、Tab鍵。

● 以滿足寬度限制,比如對于“%5d”,只取5位整數。

● 遇到非法輸入,比如“a”不是合法的十進制數,但是合法的十六進制數。

例如,對語句:

            scanf("%d%c%f",&x,&y,&z);

如果輸入的是:

            56t8o.34↙         (結果x為56,y為't',z為8)

則對應第一個格式%d輸入56之后遇到字母t,便認為第一個數據到此結束,把56送給變量x。字符 't' 送給變量y,由于%c只要求輸入一個字符,因此“t”后面不需要空格,后面的數值應送給變量z。如果由于疏忽把本來應為80.34的數錯輸入成8o.34,則由于8后面出現字符o,就認為此數值結束,將8送給z,多余部分自動舍棄。

④ 標準C在scanf函數中不使用%u說明符,對unsigned型數據,以%d或%o、%x格式輸入。

⑤ 輸入數據時不能規定精度,形如"%8.2f"的格式說明是錯誤的。

⑥ 可以指定輸入數據所占的列數,系統自動按此列數截取所需數據。例如:

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

如果輸入:

            12345↙

則系統自動將123賦給a,45賦給b。

⑦“%”后的“*”附加說明符,用來表示跳過相應的數據。在利用現成的一批數據時,如果不需要其中的某些數據,則可以利用此種方法。例如:

            scanf("%2d%*3d%2d",&a,&b);

如果輸入以下信息:

            1234567↙

則將12賦給變量a,67賦給變量b。第二個數據345被跳過不賦給任何變量。

【例3.5】 求任意兩個整數的和。

分析:如果問題中出現“任意”等字眼,通常意味著,程序所處理的數據是在運行程序時從鍵盤輸入的。輸入整數的方法是調用scanf函數。

程序的算法過程可用圖3.2表示。

圖3.2 求任意兩個整數的和

源程序如下:

            1   #include <stdio.h>
            2   void main()
            3   {   int a,b,sum;
            4       printf("輸入用逗號分隔的兩個整數:");       /* 輸入提示 */
            5       scanf("%d,%d",&a,&b);                    /* 格式輸入語句 */
            6       sum=a+b;                                 /* 賦值語句 */
            7       printf("%d和%d的和是%d",a,b,sum);        /* 格式輸出語句 */
            8   }

程序的運行結果如下:

            輸入用逗號分隔的兩個整數3, 5↙
            3和5的和是8
主站蜘蛛池模板: 东平县| 武山县| 景宁| 萨嘎县| 日照市| 陇川县| 青田县| 丹凤县| 沙河市| 慈利县| 独山县| 定边县| 教育| 公主岭市| 丽江市| 当雄县| 新竹县| 辛集市| 张家港市| 大英县| 方城县| 正镶白旗| 丽水市| 竹北市| 普兰县| 内黄县| 牙克石市| 资讯 | 彭山县| 长子县| 南康市| 龙井市| 张北县| 邮箱| 崇阳县| 望奎县| 同仁县| 佛山市| 司法| 浮梁县| 和龙市|