C語言程序設(shè)計(jì)(第3章程序控制語句)2

字號(hào):

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