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);輸出結果:z5)字元資料可以是轉義字元。如:
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語言學習筆記之檔案的分割與合併
後記: 此篇為總結篇,回顧之前的基礎知識,留個印記。歡迎交流學習~