- C程序設計語言
- 魏東平 朱連章 于廣斌編著
- 2747字
- 2018-12-29 14:37:41
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 ↙
再看一個輸入實型和字符型數據的例子:
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