1. 程式人生 > >C語言 基本輸入輸出函式

C語言 基本輸入輸出函式

1 幾組常見的輸入輸出函式

在stdio.h標頭檔案中內建了幾種輸入輸出函式,如下列出:

  • printf 與 scanf
  • getchar 與 putchar
  • gets 與 puts

相比之下 printf 與 scanf的功能最為強大,但操作稍顯複雜,後兩種則功能簡單,但針對性較強。

2 printf函式

功能:按照規定格式輸出指定資料

2.1.一般形式:如圖

這裡寫圖片描述

格式控制:由“%”後跟格式字元組成。將輸出資料轉換為指定格式輸出,字串原樣輸出,轉義字元對輸出形式進行控制。

2.2.格式說明

這裡寫圖片描述

附加格式說明字元 說 明
- 輸出的數字或字元以左對齊,右邊填空格
0(數字) 輸出的空位用0填充。
m(一個正整數) 輸出資料的欄位寬度。如果實際位數多於m,按實際位數輸出;如果實際位數少於m,則補以空格或0。
.n(一個正整數) 對實數,表示輸出n位小數;對字串,表示擷取的字元個數。
l(字母) 輸出長整型整數

2.2.1常見格式輸出

%d —— 以帶符號的十進位制形式輸出整數
%o —— 以無符號的八進位制形式輸出整數
%x —— 以無符號的十六進位制形式輸出整數
%u —— 以無符號的十進位制形式輸出整數
%c —— 以字元形式輸出單個字元
%s —— 輸出字串
%f —— 以小數點形式輸出單、雙精度實數
%e —— 以標準指數形式輸出單、雙精度實數
%g —— 選用輸出寬度較小的格式輸出實數

2.3 %d格式符

格式: %[-][0][m][l]d

說明:

  • %d 按整型資料的實際長度輸出。

  • %[0]md 以m指定的欄位寬度輸出,如果資料的位數小於m,則左端補以空格;若m前面有“0”,則左端補以0。

  • %-md 以m指定的欄位寬度輸出,左對齊。

  • %ld 輸出長整型資料。

2.4 %c格式符

格式:%[m]c

說明:輸出一個字元。輸出資料可以是單個字元,或一個範圍在0~255之間的整數。

例:

#include <stdio.h>
main( )
{   char x=‘a’;  int i=98;
    printf("%c,%d
\n"
,x,x); printf("%c,%d\n",i,i); } // output a,97 b,98

2.5 %s格式符

格式:%[-][m][.n]s

說明:

  • %s 直接輸出指定字串。

  • %ms 輸出字串佔m列,右對齊。m小於字串長度時原樣輸出,大於字串長度時不足補空格,下同。

  • %-ms 輸出字串佔m列,左對齊。

  • %m.ns 輸出字串前n個字元,佔m列,右對齊。

例:

#include<stdio.h> 

void main(){
    printf("%3s,%-6s,%-5.2s,%4.3s,%.3s,","hello", 
    "hello","hello","hello","hello");
}
輸出結果:
hello,hello ,he   , hel,hel,

2.6 %f格式符

格式: %[-][0][m][.n][l]f

說明:

  • %f 整數部分全部輸出,小數部分輸出6位(四捨五入)。

  • 0 右邊補0滿足小數位數,或左邊補0滿足m列

  • %m.nf 輸出資料共佔m列,小數佔n位,右對齊。只有m時,當m大於字串長度則需補足m列,當m小於字串長度則與%f同

  • %-m.nf 輸出資料共佔m列,小數佔n位,左對齊。

  • %lf 以雙精度輸出

例:

#include<stdio.h> 

void main(){

    float f=3.14159;
    printf("%f,%07.3f,%-7.3f,%10f,%.3f,",f,f,f,f,f);
}  

// output:
3.141590,003.142,3.142  ,  3.141590,3.142,

2.7 %e格式符

格式:%[-][0][m][.n]e

說明:

  • %e:輸出資料共佔13位,其中整數部分為1位非零數字,小數點佔1位,小數部分為6位,指數部分e佔1位,指數符號佔1位,指數為3位。若輸出資料為負數,還應增加一位整數部分的符號位。

  • %m.ne 輸出佔m列,小數位為n項(四捨五入)。m小於輸出寬度時原樣輸出,大於輸出寬度時補足空位

  • –設定左對齊

如下圖
這裡寫圖片描述

例:

#include<stdio.h> 

void main(){
    printf("\n,%10.1e",31.5);
}
// output
,  3.2e+001

2.8 %o、%x和%u格式符

格式: %[-][0][m][l]o(x或u)

說明:
將記憶體單元中的二進位制數(包括符號位)直接轉換成八進位制數、十六進位制或十進位制數輸出。

  • %o 輸出無符號八進位制
  • %x 輸出無符號十六進位制
  • %u 輸出無符號十進位制

例:

#include<stdio.h> 

void main(){
    int i=-1;
    printf("\n%d,%o,%x,%u",i,i,i,i);
}

// output
-1,37777777777,ffffffff,4294967295

例:

#include<stdio.h> 

void main(){
    unsigned char ch1 = 255; // 1111 1111  ,1位元組
    char ch2 = -128;
    // %hh 限定了字元為8位一個位元組 
    // %hhd 有符號十進位制字元型 %hhu 無符號十進位制字元型
    printf("\n\n%hhd,%hhu,%hho,%hhx",ch2,ch1,ch1,ch1);//128,255,377,ff
    // %h 限定了16位2個位元組     
    unsigned short sh1 = 65535; // 1111 1111 1111 1111 ,2位元組
    short sh2 = -32767; 
    printf("\n%hu,%hd,%ho,%hx",sh2,sh1,sh1,sh1);  // 32769,-1,177777,ffff

    // %l 限定了32位4個位元組 
    unsigned long ulong = 4294967295; //1111 1111 1111 1111 1111 1111 1111 1111  ,4位元組
    long slong = -2147483647;
    printf("\n%ld,%lu,%lo,%lx",slong,ulong,ulong,ulong); // -2147483647,4294967295,37777777777,ffffffff

    // %ll 限定了64位8個位元組 
    unsigned long long ull= 4294967295;
    long long ll = -2147483647;
    printf("\n%lld,%llu,%llo,%llx",ll,ull,ull,ull);  // -2147483647,4294967295,37777777777,ffffffff


    // %e指數輸出
    long double lb = 198888888888;
    printf("\n%Lf,%Le,%Lo,%Lx,%Lg",lb,lb,lb,lb,lb);  // 0.000000,5.180393e-317,47776740,9ffdd0,5.18037e-317
    printf("\n%La,%LA",lb,lb); // 輸出十六進位制的指數形式  0x0.000000p-1022,0X0.000000P-1022
}

2.9 %g格式符

根據數值的大小,自動選擇用f格式或e格式輸出實數。輸出時選擇佔寬度較小的一種,且不輸出無意義的零。

例:

#include<stdio.h> 

void main(){
    float f=3.14159;
    printf("\n%e,%f,%lf,%g",f,f,f,f);
} 
// output
3.141590e+000,3.141590,3.141590,3.14159

2.10 使用printf的注意事項

  • 不同型別的資料應使用相應型別的格式字元說明其輸出形式,以保證顯示結果符合預期。

  • 格式字元中,除了X、E、G外,其他均用小寫字母,如“%d”不能寫成“%D”。

  • 如需輸出雙引號,應在“格式控制”中表示為轉義字元的形式並用單引號引起來,即“\””。

  • 如需輸出字元“%”,在“格式控制”中用連續兩個“%”即可。
    如:printf(“%d%%”,10);

  • 當“格式控制”中格式符個數少於輸出表中的輸出項時,多餘的輸出項不予輸出。

  • 當“格式符”多於輸出項時,多出的格式符輸出結果為不定值。

3 scanf函式

與printf函式一樣,scanf函式也是遵守格式化(format)原則,所謂格式化,是該函式預先給程式設計師定義了一批輸入格式,程式設計師可以選擇其中的某些格式,遵守這些格式,scanf函式就可以按照指定的格式來接收鍵盤的輸入資料了。

scanf函式只能在控制檯程式中使用,有視窗的介面程式無法通過scanf接收按鍵。當控制檯中出現閃爍的游標時,表示程式在等待使用者輸入資料。在控制檯程式中,一般以回車鍵代表資料輸入完畢,下達命令,指示程式開始工作。scanf函式可以接收多個任意型別的資料,但需嚴格遵守format格式,否則會出錯。

3.1 一般形式:如圖

這裡寫圖片描述

功能:要求使用者從鍵盤上輸入指定格式的資料。
說明:如果資料不止一個,應在資料之間用一個或多個空格間隔,也可以用回車鍵或跳格鍵tab間隔。

3.2 scanf格式控制

格式控制

格式符 說明
d 用於輸入十進位制整數
o 用於輸入八進位制形整數
x 用於輸入十六進位制整數
c 用於輸入一個字元
s 用於輸入字串,並將字串送到一個字元陣列中。輸入時以非空白字元開始, 第一個空白字元結束。字串以串結束標誌“\0”作為其最後一個字元。
f 用於輸入實數。輸入時用小數點形式或指數形式均可。(輸入雙精度必須用%lf,否則不能正常輸入)
e 與f作用相同

附加格式

格式字元 說明
* 表示本輸入項在輸入後不賦給相應的變數。(不儲存)
l(字母) 用於輸入長整型和雙精度實型資料
m(一個正整數) 用於輸入長整型和雙精度實型資料

3.3 scanf函式的格式字串的組成

  • 格式符
    和printf函式類似,scanf函式的格式字串以%開始,以一個格式字元結束,中間可以插入附加字元。格式符告訴了scanf函式該讀取什麼樣的資料。

  • 空白符
    空白符可以是空格(space,用空格鍵輸入)、製表符(tab,用Tab鍵輸入)和新行符(newline,用回車鍵輸入),或者它們的組合

  • 非空白符
    除去格式說明符合空白符之外,就是非空白符。非空白符在使用者輸入的時候,也必須一併輸入。非空白符使scanf() 在緩衝區中讀一個匹配的字元並將這個字元忽略。例如,”%d,%d”使scanf()先讀入一個整數,接著必須要讀入一個逗號,讀入到逗號後,表示格式匹配,將讀入的逗號丟棄,而不像讀入的整數儲存到某個記憶體空間。讀入逗號後,接著讀入另一個整數。如發現不能匹配格式字串,比如沒有讀到逗號,scanf()返回,讀入失敗。

3.4 使用scanf注意事項

  • 1)注意變量表列中,應該是變數的地址。變數的地址通過求地址符&得到。所以在寫程式碼時千萬不要遺漏&符號。

  • 2)如果格式字串中有非空白字元,也就是除了格式控制字元和空白字元之外的字元,則使用者在輸入的時候一定也要輸入這些字元。否則將出現不匹配格式控制字串的情況。為了使使用者正確輸入,程式設計時一定要考慮到使用者是否清楚如何輸入,最好在需要使用者輸入前提示如何輸入的格式。

  • 3)在用%c格式符時,空格字元和轉義字元都被當作有效字元輸入

  • 4)以回車作為下達開始解析命令。整個輸入以回車結束。

    如果輸入的資料滿足了scanf對需要,則輸入結束,如果回車後資料不夠,則回車只當作一個空白符。

  • 5)scanf解析資料,下列情況認為解析出來一個數據:

    讀入非字元型資料時,遇到空白字元。有寬度指示時,讀入到相應的寬度。如%4d,則只解析4個數字即認為讀入這個整數完畢。

  • 6) 讀取雙精度double浮點數時,最好使用%lf輸入,使用%f可能會導致精度損失甚至讀取失敗。

3.5 scanf使用示例

// 1)可以指定輸入的資料所佔據的字元個數,scanf函式自動按照指示擷取所需長度的資料。如:
    int i,j;
    scanf("%3d%3d",&i,&j);  // 輸入:1234567↙
    printf("%d,%d",i,j);  // 輸出  123,456

// 2)%後面的*格式符,用來表示在解析時,將讀入的資料忽略不賦給任何變數。如:
    int i,j;
    scanf("%d %*d %d",&i,&j); // 輸入: 123 456 789 
    printf("%d,%d",i,j);    // 輸出: 123,789
// 3)輸入資料時不能指定精度。如:
    float f;
    scanf("%7.2f",&f); // 輸入 123.456 
    printf("%f23",f); // 輸出 0.00000023 
// 4) 輸入雙精度數使用%lf
    // 輸入雙精度浮點數時,務必用%lf,如下錯誤
    double db;
    scanf("%f",&db);  //輸入: 123.456
    printf("%f",db); // 輸出 : 0.000000 

4 字元輸入輸出(getchar/putchar)

有些時候,僅僅為了在顯示器螢幕上列印或從控制檯獲取一個字元,此時使用功能強大的printf與scanf函式,則顯得過於繁瑣,C提供了一個庫函式putchar/getchar來完成這個簡單的任務。

4.1 putchar

putchar 函式是字元輸出函式, 其功能是在顯示器上列印單個字元。putchar函式是一個標準的C語言庫函式,它的函式原型在標頭檔案“stdio.h”中。

1 putchar函式的一般格式:

putchar(字元資料);

其中的putchar是函式名稱。

2 可以輸出的字元型別:

  • 1)字元資料可以是一個字元型變數,如:char c_var= ‘a’; putchar(c_var);

  • 2)字元資料也可以是一個字元常量,如putchar(‘a’);輸出結果:a

  • 3)字元資料還可以是一個整數。整數可以是十進位制整數,如:putchar(97);輸出結果:a

  • 4)字元資料還可以是一個表示式,只要結果是255以內的整數即可。如:
    putchar(‘a’+25);輸出結果:z

  • 5)字元資料可以是轉義字元。如:
    putchar(‘\n’);結果輸出一個換行。putchar(‘\007’); 輸出一個提示音

4.2 getchar

這個函式和前面介紹的putchar函式剛好相反。

getchar 函式是得到字元輸入函式,其功能是得到使用者輸入的一個字元。getchar函式是一個標準的C語言庫函式,它的函式原型在標頭檔案“stdio.h”中。

getchar函式的一般格式是:

char ch;
ch=getchar();

使用者輸入的字元就賦給了ch變數。如:

char ch;
ch=getchar();  // 獲取輸入的字元
printf("%c",ch);

5 字串輸入輸出函式 (gets與puts)

5.1 puts

puts函式功能非常單一,在顯示器螢幕上輸出一個字串,並換行。

一般形式:

puts(字串);

如:

puts("你好啊~");
輸出結果:
你好啊~

5.2 gets

gets從標準輸入裝置讀字串函式。可以無限讀取,不會判斷上限,以回車結束讀取,所以程式設計師應該確保buffer的空間足夠大,以便在執行讀操作時不發生溢位。此函式在stdio.h標頭檔案中定義的。

功能

    從stdio流中讀取字串,直至接受到換行符或EOF時停止,並將讀取的結果存放在buffer指標所指向的字元陣列中。換行符不作為讀取串的內容,讀取的換行符被轉換為‘\0’空字元,並由此來結束字串。 

返回值

    讀入成功,返回與引數buffer相同的指標;讀入過程中遇到EOF(End-of-File)或發生錯誤,返回NULL指標。所以在遇到返回值為NULL的情況,要用ferror或feof函式檢查是發生錯誤還是遇到EOF。 

示例

    #include <stdio.h>   
    void main(void)
    {
       char buf[20];  //不要char*p,然後gets(p),這是錯誤的,因為p沒有指向有效的記憶體,它可能指向任何非法地址 ,造成非法訪問異常                 
       gets(buf);
       printf("%s\n", buf);
    }

與gets/puts類似的還有fgets與fputs,它們一般用於對檔案的操作。關於fgets與fputs的用法案例可以參考C語言學習筆記之檔案的分割與合併

後記: 此篇為總結篇,回顧之前的基礎知識,留個印記。歡迎交流學習~