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

1.4 標準輸入/輸出函數

輸入是從輸入設備(如鍵盤)向計算機輸入數據的過程;輸出是把程序的計算結果輸出到輸出設備(如顯示器)的過程。C語言沒有提供專門的輸入/輸出語句,是利用C標準函數庫中提供的輸入/輸出函數實現的,C語言輸入/輸出函數庫見附錄D。

C標準函數庫中專門的輸入/輸出函數很多,這些函數有格式輸入/輸出函數scanf()和printf(),字符輸入/輸出函數getchar()和putchar(),字符串輸入/輸出函數gets()和puts()等。這些函數的聲明構成一個名為stdio.h的輸入/輸出函數庫,用戶程序要使用輸入和輸出函數時,要在程序文件的開始位置添加如下的宏定義,把stdio庫包含到用戶程序:

      #include<stdio.h>
  

然后在用戶程序中直接調用所需要的輸入/輸出函數即可。

1.4.1 格式化輸出函數printf()

(1)printf函數的調用格式

stdio庫提供的格式化輸出函數printf()的主要功能是向顯示器(標準輸出設備)輸出指定的若干個格式化的數據,適用于任意的數據類型。輸出值正常,返回輸出字節數;輸出值出錯,返回EOF(-1)。函數的一般調用格式為:

printf(格式控制字符串,輸出列表);

例如:

說明:

①格式控制字符串是用雙引號引起來的字符串,它包含如下三種信息:

·格式說明符:由“%”和格式字符組成,如%d、%f等。它總是由“%”開始,其作用是將輸出的數據轉換為指定的格式輸出。

·普通字符:即要原樣輸出的字符,一般為提示信息。如“printf("a=%d,b=%f\n",a,b);”中的“a= ,b= ”即為提示信息,是為了便于用戶更好地使用程序而加入的。

·轉義字符:輸出一些操作行為,如換行符等。

②“輸出列表”是需要輸出的一些數據項,可以是變量或表達式列表,其項數一般與控制參數中的格式轉換控制符個數相同,格式如下:

如變量a的值為128,則上述語句的輸出結果為:a=128。

(2)常用的格式控制字符

在printf()函數中常用的格式字符如表1-4所示。

表1-4 printf()函數中的格式字符

在printf()函數中除了這些常用的格式字符外,還可以在這些格式符前加以下幾種特定的附加修飾符,用于修飾輸出特定格式或數據類型,如表1-5所示。

表1-5 printf()函數中的附加格式修飾字符

(3)格式控制字符用法舉例

下面我們來看它們的具體用法。

①d格式符:用來輸出十進制帶符號整數,有以下幾種用法:

%d:按十進制整型數據的實際長度輸出。

%md或%-md:m為指定的輸出字段寬度為1個正整數。若實際數據的位數小于m,則左端補空格;若大于m,則按實際位數輸出。當m前有“-”號時,表示按m指定寬度左對齊,右端補空格。

%ld:輸出長整型數據,%mld輸出指定寬度的長整型數據。

②c格式符:用于輸出1個字符。

對于整數,只要它的值在0~255范圍內,也可以用字符形式輸出。

1個字符數據也可以轉換成相應的整型數據(ASCII值)輸出。

③s格式符:用于輸出1個字符串。有以下幾種用法:

%s:最常用格式,直接輸出串的內容。

%ms或%-ms:輸出的字符串占m列,如字符串本身長度大于m,則突破m的限制輸出字符串的全部內容;若串長小于m,則輸出的字符串左補空格。%-ms意義同上,但當串長小于m時,則輸出的字符串右補空格。

%m.ns或%-m.ns:輸出占m列,但只取串中左端的n個字符。這n個字符輸出在m列的右側,左補空格。%-m.ns中的m、n含義同上,但右補空格。而如果n>m時,m取n的值,即保證要求的n個字符輸出。

【例1-7】讀程序,理解printf函數指定格式輸出的用法。

      / *源程序1-7.C* /
      #include  <stdio.h>
      void main()
      {
      int i=100,j=1;                            / * 定義基本整型變量 * /
      long int a=123456;                        / * 定義長整型變量 * /
      float f1,f2;
      f1=(float)2738.54;f2=(float)-3.012;
      char cl='A',c2='a';
      printf("%-12x\t%o\t%5d\n",i,i,j);
      printf("%+12.3f\t\t%-6.0f\n",f1,f2);
      printf("%3c\t%c\n",cl,c2);
      printf("c=%ld\tc=%12ld\n",a,a);             / * 輸出十進制長整數 * /
      printf("%3s,%7.3s,%.4s,%-5.2s\n","Super","Super","Super","Super");
      }
  

本程序的運行結果為:

      64              144      1
      +2738.540       -3
      Aa
      c=123456        c=123456
      Super,          Sup,Supe,Su
  

④o格式符:以八進制整數形式輸出。

⑤x格式符:以十六進制整數形式輸出。

⑥u格式符:用于輸出unsigned(無符號)型數據,以十進制整數形式輸出。

1.4.2 格式化輸入函數scanf()

stdio庫提供的scanf()函數可以用來從鍵盤(標準輸入設備)輸入任何類型的多個數據。輸入正常,返回讀取的代碼值;輸入出錯,返回EOF(-1)。

(1)scanf函數的調用格式

scanf()函數的一般調用形式為:

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

“格式控制字符串”的含義同printf()函數。

“地址列表”是由若干個地址組成的列表,用于接收輸入的數據。可以是變量的地址,或字符串的首地址等。

變量地址是由地址運算符“&”后接變量名組成的,例如,&a和&b分別表示了變量a和變量b的地址。&是一個取地址運算符,&a是一個表達式,其功能是求變量的地址。變量的地址是C編譯系統分配的,用戶不必關心具體的地址是多少。

(2)格式控制字符

scanf()函數與printf()函數中的格式字符基本相同,用法也基本相同,其差異見下面的說明。表1-6列出了scanf()函數中用到的格式字符,表1-7列出可以使用的附加修飾符。

表1-6 scanf()函數中的格式字符

表1-7 scanf()函數中的附加格式說明字符

對于unsigned類型的數據,在輸入時既可以用%u,也可以用%d,甚至%x、%o均可。輸入時可以指定數據所占的列數(域寬),系統將按它自動截取需要的數據。說明如下:

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

輸入時的格式:a=10 b=20↙     / * 普通字符,要原樣輸入 * /

說明:系統取10給變量a,20給變量b。用"%d%d%d"格式輸入時,不能用逗號(可用空格)作兩個輸入數據間的分隔符。

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

輸入:123456 ↙

輸出:a=123,b=45

系統自動將123賦給a,45賦給b。也可用于字符型。

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

輸入:123456↙

輸出:a=12,b=56

說明:使用了“*”格式修飾符,則表示跳過它所指定的列數。則系統截取2位整數12賦給變量a,而跳過中間的兩位34,取最后的兩位56給變量b。

④輸入數據時不能規定數據的精度,如以下的輸入語句:

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

是不合法的。這樣做變量a根本無法得到正確的輸入。

1.4.3 字符輸入輸出函數

(1)字符輸入函數getchar()

getchar()函數的功能是接收從終端(鍵盤或系統指定的輸入設備)輸入的1個字符,它沒有參數,但從輸入設備中接收的字符通過函數返回值的形式得到。其基本格式為:

      ch=getchar();
  

其中ch為字符型的變量(或整型變量)。程序執行完此語句后,ch中即存入了用戶從鍵盤上鍵入的字符。

(2)字符輸出函數putchar()

putchar()函數的作用是向終端輸出一個字符。其基本格式為:

      putchar(c);
  

其用途是輸出字符型參數c的值。參數c通常為字符型變量或字符常量,也可以是整型變量或整型常量(對大于255的整數,則只取低位字節中的數據)。

【例1-8】從鍵盤輸入大寫字母,用小寫字母輸出。

      / *源程序1-8.C* /
      #include <stdio.h>
      void main()
      {
        char c1,c2;
        c1=getchar();              / * 調用getchar()函數從鍵盤接收一個字符,并將之賦給變量c1* /
        printf("%c,%d\n",c1,c1);   / * 調用printf()函數格式輸出c1* /
        c2=c1+32;
        putchar(c2);               / * 輸出字符變量c2中的數據,即字符'a'* /
        printf("%d\n",c2);
        putchar('\n');             / * 輸出換行符 * /
      }
  

程序的運行結果為:

      輸入:A ?
      輸出:A,65
            a,97
  
主站蜘蛛池模板: 分宜县| 桃源县| 炉霍县| 资溪县| 中阳县| 阿图什市| 宁阳县| 资源县| 安平县| 五家渠市| 镇江市| 额尔古纳市| 龙州县| 华蓥市| 大方县| 连州市| 南岸区| 大冶市| 杭锦后旗| 呼图壁县| 石台县| 文安县| 黄梅县| 偏关县| 南部县| 柘荣县| 安化县| 成都市| 龙岩市| 阜康市| 株洲市| 丽江市| 灵璧县| 宣恩县| 镇远县| 盐源县| 祁门县| 新宁县| 普定县| 平山县| 玉山县|