Linux C輸入輸出函數


格式化輸入輸出函數

這些函數都要包含頭文件stdio.h, 以v開始的還要包含頭文件stdarg.h

1. 輸出
printf: 格式化輸出數據
函數定義: int printf(const char *format, ...);
函數說明: printf()會根據參數format字符串來轉換並格式化數據, 然後將結果寫出到標準輸出設備, 直到出現字符串結束符('\0')爲止. 成功則返回實際輸出的字符數, 失敗則返回-1, 錯誤原因存在於errno中.
fprintf: 格式化輸出數據至文件
函數定義: int fprintf(FILE *stream, const char *format, ...);
說明: fprintf()同printf(), 不同點將結果輸出到參數stream指定的文件中.
sprintf: 格式化字符串複製
函數定義: int sprintf(char *str, const char *format, ...);
說明: sprintf()同printf(), 不同點將結果複製到參數str所指的字符串數組中.
snprintf: 格式化字符串複製
函數定義: int snprintf(char *str, size_t size, const char *format, ...);
說明: snprintf()同sprintf(), 不同點出現字符串結束符('\0')或達到參數size都爲止.


以v開始的函數功能同對應去掉v的函數, 就是參數不相同
vprintf: 格式化輸出數據
函數定義: int vprintf(const char *format, va_list ap);
vfprintf: 格式化輸入數據至文件
函數定義: int vfprintf(FILE *stream, const char *format, va_list ap);
vsprintf: 格式化字符串複製
函數定義: int vsprintf(char *str, const char *format, va_list ap);
vsnprintf: 格式化字符串複製
函數定義: int vsnprintf(char *str, size_t size, const char *format, va_list ap);

2. 輸入
scanf: 格式化字符輸入
函數定義: int scanf(const char *format, ...);
說明: scanf()會將輸入的數據根據參數format字符串來轉換並格式化數據. 成功則返回參數數目, 失敗則返回-1, 錯誤原因存於errno中.
scanf()格式轉換的一般形式如下:
%[*][size][l][h]type
以中括號括起來的參數爲選擇性參數, 而%與type則是必要的. 
* 代表該對應的參數數據忽略不保存. 
size 爲允許參數輸入的數據長度. 
l 輸入的數據數值以long int 或double型保存. 
h 輸入的數據數值以short int 型保存. 
底下介紹type的幾種形式:
%d 輸入的數據會被轉成一有符號的十進制數字(int). 
%i 輸入的數據會被轉成一有符號的十進制數字, 若輸入數據以“0x”或“0X”開頭代表轉換十六進制數字, 若以“0”開頭則轉換八進制數字, 其他情況代表十進制. 
%0 輸入的數據會被轉換成一無符號的八進制數字. 
%u 輸入的數據會被轉換成一無符號的正整數. 
%x 輸入的數據爲無符號的十六進制數字, 轉換後存於unsigned int型變量. 
%X 同%x
%f 輸入的數據爲有符號的浮點型數, 轉換後存於float型變量. 
%e 同%f
%E 同%f
%g 同%f
%s 輸入數據爲以空格字符爲終止的字符串. 
%c 輸入數據爲單一字符. 
[] 讀取數據但只允許括號內的字符. 如[a-z]. 
[^] 讀取數據但不允許中括號的^符號後的字符出現, 如[^0-9].
fscanf: 格式化字符串輸入
函數定義: int fscanf(FILE *stream, const char *format, ...);
說明: fscanf()同scanf(), 不同點從參數stream文件流中讀取字符串進行轉換.
sscanf: 格式化字符串輸入
函數定義: int sscanf(const char *str, const char *format, ...);
說明: sscanf()同scanf(), 不同點取參數str中的字符串進行轉換.

以v開始的函數功能同對應去掉v的函數, 就是參數不相同
vscanf: 格式化字符串輸入
vfscanf: 格式化字符串輸入
vsscanf: 格式化字符串輸入

參數format字符串可包含下列三種字符類型:
1. 一般文本, 伴隨直接輸出.
2. ASCII控制字符, 如\t, \n等.
3. 格式轉換字符.
    格式轉換爲一個百分比符號(%)及其後的格式字符所組成. 一般而言, 每個%符號在其後都必需有一printf()的參數與之相呼應(只有當%%轉換字符出現時會直接輸出%字符), 而欲輸出的數據類型必須與其相對應的轉換字符類型相同.
printf()格式轉換的一般形式如下:
%[flags][width][.prec]type
以中括號括起來的參數爲選擇性參數, 而%與type則是必要的. 底下先介紹type的幾種形式:
整數:
%d 整數的參數會被轉成一有符號的十進制數字
%u 整數的參數會被轉成一無符號的十進制數字
%o 整數的參數會被轉成一無符號的八進制數字
%x 整數的參數會被轉成一無符號的十六進制數字, 並以小寫abcdef表示
%X 整數的參數會被轉成一無符號的十六進制數字, 並以大寫ABCDEF表示
浮點型數:
%f double型的參數會被轉成十進制數字, 並取到小數點以下六位, 四捨五入.
%e double型的參數以指數形式打印, 有一個數字會在小數點前, 六位數字在小數點後, 而在指數部分會以小寫的e來表示.
%E 與%e作用相同, 唯一區別是指數部分將以大寫的E來表示.
%g double型的參數會自動選擇以%f或%e的格式來打印, 其標準是根據欲打印的數值及所設置的有效位數來決定.
%G 與%g作用相同, 唯一區別在以指數形態打印時會選擇%E格式.
字符及字符串:
%c 整型數的參數會被轉成unsigned char型打印出.
%s 指向字符串的參數會被逐字輸出, 直到出現NULL字符爲止.
%p 如果是參數是"void *"型指針則使用十六進制格式顯示.
prec有幾種情況:
1. 正整數的最小位數.
2. 在浮點型數中代表小數位數
3. 在%g格式代表有效位數的最大值.
4. 在%s格式代表字符串的最大長度.
5. 若爲×符號則代表下個參數值爲最大長度.
width爲參數的最小長度, 若此欄並非數值, 而是*符號, 則表示以下一個參數當做參數長度.
flags有下列幾種情況:
- 此旗標會將一數值向左對齊.
+ 一般在打印負數時, printf()會加印一個負號, 整數則不加任何負號. 此旗標會使得在打印正數前多一個正號(+).
# 此旗標會根據其後轉換字符的不同而有不同含義. 當在類型爲o之前(如%#o), 則會在打印八進制數值前多印一個o.而在類型爲x之前(%#o)則會在打印十六進制數前多印’0x’, 在型態爲e、E、f、g或G之前則會強迫數值打印小數點. 在類型爲g或G之前時則同時保留小數點及小數位數末尾的零.
0 當有指定參數時, 無數字的參數將補上0. 默認是關閉此旗標, 所以一般會打印出空白字符.

不定參數: va_list
   C語言中有些函數會利用不定參數的方式來取得參數內容, 常見的如printf(), sprintf(), execl()等等, 其最後參數是以...定義, 即代表後面的參數爲不定個數的參數內容. 不定參數相關的表頭文件在/usr/lib/gcc/include/stdarg.h其定義如下:


 函數名稱 函數原型  功能說明 
getc  int getc(FILE *stream) 從文件流中讀入一個字符
fgetc int fgetc(FILE *stream) 從文件流中讀入一個字符
getchar int getchar(void) 從標準輸入讀入一個字符
putc int putc(int c,FILE *stream) 將字符c寫入文件流中
fputc int fputs(int c,FILE *stream) 將字符c寫入文件流中
putchar int putchar(int c) 將字符c寫入標準輸出
gets char *gets(char *s)  從標準輸入中讀入字符串,直到出現換行字符或文件尾部爲止
fgets char *gets(char *s,int size,FILE *stream) 從文件流中讀入字符串,直到出現換行字符或問津尾部爲止
puts int puts(const char*s) 將指定的字符串寫到標準輸出中
puts int *fputs(char *s,FILE *stream) 將指定的字符串寫到文件流中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章