3.2 數據的輸入與輸出
在程序的運行過程中,往往需要由用戶輸入一些數據,而程序運算所得到的計算結果等又需要輸出給用戶,由此實現人與計算機之間的交互,所以在程序設計中,輸入輸出語句是一類必不可少的重要語句,在C語言中,沒有專門的輸入輸出語句,所有的輸入輸出操作都是通過對標準I / O庫函數的調用實現。最常用的輸入輸出函數有scanf( )、pri ntf( )、getchar( )和putchar( ),以下分別介紹。
3.2.1 scanf()函數
格式化輸入函數scanf( )的功能是從鍵盤上輸入數據,該輸入數據按指定的輸入格式被賦給相應的輸入項。函數一般格式為:
scanf( "控制字符串",輸入項列表);
其中控制字符串規(guī)定數據的輸入格式,必須用雙引號括起,其內容是由格式說明和普通字符兩部分組成。輸入項列表則由一個或多個變量地址組成,當變量地址有多個時,各變量地址之間用逗號“,”分隔。
scanf( )中各變量要加地址操作符,就是變量名前加“ &”,這是初學者容易忽略的一個問題。應注意輸入類型與變量類型一致。
下面探討控制字符串的兩個組成部分:格式說明和普通字符。
1. 格式說明
格式說明規(guī)定了輸入項中的變量以何種類型的數據格式被輸入,形式是:
% [ <修飾符> ] <格式字>
各個格式字符及其意義見表3 - 1。
表3-1 輸入格式字符
格式字符 意義
d 輸入一個十進制整數
o 輸入一個八進制整數
x 輸入一個十六進制整數
f 輸入一個小數形式的浮點數
e 輸入一個指數形式的浮點數
c 輸入一個字符
s 輸入一個字符串
各修飾符是可選的,可以沒有,這些修飾符是:
⑴ 字段寬度
例如:scanf("%3d",&a)
按寬度3輸入一個整數賦給變量a。
⑵ l和h
可以和d、o、x一起使用,加l表示輸入數據為長整數,加h表示輸入數據為短整數,例如:
scanf("%10ld % hd" , &x , &i)
則x按寬度為1 0的長整型讀入,而i按短整數讀入。
⑶ 字符*
*表示按規(guī)定格式輸入但不賦予相應變量,作用是跳過相應的數據。
例如:
scanf("%4d % *d % 4d" , &x , &y , &z)
執(zhí)行該語句,若輸入為“1 2 3”
結果為x = 1,z = 3,y未賦值,2被跳過。
2. 普通字符
普通字符包括空格、轉義字符和可打印字符。
(1) 空格
在有多個輸入項時,一般用空格或回車作為分隔符,若以空格作分隔符,則當輸入項中包含字符類型時,可能產生非預期的結果,例如:
scanf("%d %c" , &a , &ch)
輸入32q
期望a = 32,ch = q,但實際上,分隔符空格被讀入并賦給ch。
為避免這種情況,可使用如下語句:
scanf("%d %c" , &a , &ch)
此處% d后的空格,就可跳過字符“ q”前的所有空格,保證非空格數據的正確錄入。
(2) 轉義字符: \n、\t
先看下面的例子:
scanf("%d %d" , &a , &b);
scanf("%d %d %d" , &x , &y , &z);
輸入為1 2 3
4 5 6
結果為:a = 1, b = 2, x = 3, y = 4, z = 5
若將上述語句改為:
scanf("%d %d\n" , &a , &b);
scanf("%d %d %d" , &x , &y , &z);
對同樣的輸入,其結果為a = 1,b = 2,x = 4,y = 5,z = 6,由于在第一個scanf的最后有一個\n,所以第二個scanf語句將從第二個輸入行獲得數據。
(3) 可打印字符
例如:scanf("%d,%d,%c",&a,&b,&ch);
當輸入為: 1, 2, q
即:a = 1,b = 2,ch = q
若輸入為1 2 q
在程序的運行過程中,往往需要由用戶輸入一些數據,而程序運算所得到的計算結果等又需要輸出給用戶,由此實現人與計算機之間的交互,所以在程序設計中,輸入輸出語句是一類必不可少的重要語句,在C語言中,沒有專門的輸入輸出語句,所有的輸入輸出操作都是通過對標準I / O庫函數的調用實現。最常用的輸入輸出函數有scanf( )、pri ntf( )、getchar( )和putchar( ),以下分別介紹。
3.2.1 scanf()函數
格式化輸入函數scanf( )的功能是從鍵盤上輸入數據,該輸入數據按指定的輸入格式被賦給相應的輸入項。函數一般格式為:
scanf( "控制字符串",輸入項列表);
其中控制字符串規(guī)定數據的輸入格式,必須用雙引號括起,其內容是由格式說明和普通字符兩部分組成。輸入項列表則由一個或多個變量地址組成,當變量地址有多個時,各變量地址之間用逗號“,”分隔。
scanf( )中各變量要加地址操作符,就是變量名前加“ &”,這是初學者容易忽略的一個問題。應注意輸入類型與變量類型一致。
下面探討控制字符串的兩個組成部分:格式說明和普通字符。
1. 格式說明
格式說明規(guī)定了輸入項中的變量以何種類型的數據格式被輸入,形式是:
% [ <修飾符> ] <格式字>
各個格式字符及其意義見表3 - 1。
表3-1 輸入格式字符
格式字符 意義
d 輸入一個十進制整數
o 輸入一個八進制整數
x 輸入一個十六進制整數
f 輸入一個小數形式的浮點數
e 輸入一個指數形式的浮點數
c 輸入一個字符
s 輸入一個字符串
各修飾符是可選的,可以沒有,這些修飾符是:
⑴ 字段寬度
例如:scanf("%3d",&a)
按寬度3輸入一個整數賦給變量a。
⑵ l和h
可以和d、o、x一起使用,加l表示輸入數據為長整數,加h表示輸入數據為短整數,例如:
scanf("%10ld % hd" , &x , &i)
則x按寬度為1 0的長整型讀入,而i按短整數讀入。
⑶ 字符*
*表示按規(guī)定格式輸入但不賦予相應變量,作用是跳過相應的數據。
例如:
scanf("%4d % *d % 4d" , &x , &y , &z)
執(zhí)行該語句,若輸入為“1 2 3”
結果為x = 1,z = 3,y未賦值,2被跳過。
2. 普通字符
普通字符包括空格、轉義字符和可打印字符。
(1) 空格
在有多個輸入項時,一般用空格或回車作為分隔符,若以空格作分隔符,則當輸入項中包含字符類型時,可能產生非預期的結果,例如:
scanf("%d %c" , &a , &ch)
輸入32q
期望a = 32,ch = q,但實際上,分隔符空格被讀入并賦給ch。
為避免這種情況,可使用如下語句:
scanf("%d %c" , &a , &ch)
此處% d后的空格,就可跳過字符“ q”前的所有空格,保證非空格數據的正確錄入。
(2) 轉義字符: \n、\t
先看下面的例子:
scanf("%d %d" , &a , &b);
scanf("%d %d %d" , &x , &y , &z);
輸入為1 2 3
4 5 6
結果為:a = 1, b = 2, x = 3, y = 4, z = 5
若將上述語句改為:
scanf("%d %d\n" , &a , &b);
scanf("%d %d %d" , &x , &y , &z);
對同樣的輸入,其結果為a = 1,b = 2,x = 4,y = 5,z = 6,由于在第一個scanf的最后有一個\n,所以第二個scanf語句將從第二個輸入行獲得數據。
(3) 可打印字符
例如:scanf("%d,%d,%c",&a,&b,&ch);
當輸入為: 1, 2, q
即:a = 1,b = 2,ch = q
若輸入為1 2 q

