天天看點

C語言中格式化輸入輸出函數(轉)

1.1.1 格式化輸入輸出函數

一、printf()函數

printf()函數是格式化輸出函數, 一般用于向标準輸出裝置按規定格式輸出

資訊。在編寫程式時經常會用到此函數。printf()函數的調用格式為:

printf("", );

其中格式化字元串包括兩部分内容: 一部分是正常字元, 這些字元将按原

樣輸出; 另一部分是格式化規定字元, 以"%"開始, 後跟一個或幾個規定字元,

用來确定輸出内容格式。

參量表是需要輸出的一系列參數, 其個數必須與格式化字元串所說明的輸出

參數個數一樣多, 各參數之間用","分開, 且順序一一對應, 否則将會出現意想

不到的錯誤。

1. 格式化規定符

Turbo C2.0提供的格式化規定符如下:

━━━━━━━━━━━━━━━━━━━━━━━━━━

符号 作用

——————————————————————————

%d 十進制有符号整數

%u 十進制無符号整數

%f 浮點數

%s 字元串

%c 單個字元

%p 指針的值

%e 指數形式的浮點數

%x, %X 無符号以十六進制表示的整數

%0 無符号以八進制表示的整數

%g 自動選擇合适的表示法

━━━━━━━━━━━━━━━━━━━━━━━━━━

說明:

(1). 可以在"%"和字母之間插進數字表示最大場寬。

例如: %3d 表示輸出3位整型數, 不夠3位右對齊。

%9.2f 表示輸出場寬為9的浮點數, 其中小數位為2, 整數位為6,

小數點占一位, 不夠9位右對齊。

%8s 表示輸出8個字元的字元串, 不夠8個字元右對齊。

如果字元串的長度、或整型數位數超過說明的場寬, 将按其實際長度輸出。

但對浮點數, 若整數部分位數超過了說明的整數位寬度, 将按實際整數位輸出;

若小數部分位數超過了說明的小數位寬度, 則按說明的寬度以四舍五入輸出。

另外, 若想在輸出值前加一些0, 就應在場寬項前加個0。

例如: %04d 表示在輸出一個小于4位的數值時, 将在前面補0使其總寬度

為4位。

如果用浮點數表示字元或整型量的輸出格式, 小數點後的數字代表最大寬度,

小數點前的數字代表最小寬度。

例如: %6.9s 表示顯示一個長度不小于6且不大于9的字元串。若大于9, 則

第9個字元以後的内容将被删除。

(2). 可以在"%"和字母之間加小寫字母l, 表示輸出的是長型數。

例如: %ld 表示輸出long整數

%lf 表示輸出double浮點數

(3). 可以控制輸出左對齊或右對齊, 即在"%"和字母之間加入一個"-" 号可

說明輸出為左對齊, 否則為右對齊。

例如: %-7d 表示輸出7位整數左對齊

%-10s 表示輸出10個字元左對齊

2. 一些特殊規定字元

━━━━━━━━━━━━━━━━━━━━━━━━━━

字元 作用

——————————————————————————

換行

f 清屏并換頁

回車

Tab符

xhh 表示一個ASCII碼用16進表示,

其中hh是1到2個16進制數

━━━━━━━━━━━━━━━━━━━━━━━━━━

例1

#include

#include

int main()

{

char c, s[20], *p;

int a=1234, *i;

float f=3.141592653589;

double x=0.12345678987654321;

p="How do you do";

strcpy(s, "Hello, Comrade");

*i=12;

c='x41';

printf("a=%d ", a);

printf("a=%6d ", a);

printf("a=%06d ", a);

printf("a=%2d ", a);

printf("*i=%4d ", *i);

printf("*i=%-4d ", *i);

printf("i=%p ", i);

printf("f=%f ", f);

printf("f=6.4f ", f);

printf("x=%lf ", x);

printf("x=%18.16lf ", x);

printf("c=%c ", c);

printf("c=%x ", c);

printf("s[]=%s ", s);

printf("s[]=%6.9s ", s);

printf("s=%p ", s);

printf("*p=%s ", p);

printf("p=%p ", p);

getch();

retunr 0;

}

上面結果中的位址值在不同計算機上可能不同。

例1.中第一條語句#include的含義是調用另一個檔案stdio.h, 這

是一個頭檔案, 其中包括全部标準輸入輸出庫函數的資料類型定義和函數說明。

二、scanf()函數

scanf()函數是格式化輸入函數, 它從标準輸入裝置(鍵盤) 讀取輸入的資訊。

其調用格式為:

scanf("", );

格式化字元串包括以下三類不同的字元;

1. 格式化說明符: 格式化說明符與printf()函數中的格式說明符基本相同。

2. 空白字元: 空白字元會使scanf()函數在讀操作中略去輸入中的一個或多

個空白字元。

3. 非空白字元: 一個非空白字元會使scanf()函數在讀入時剔除掉與這個非

空白字元相同的字元。

位址表是需要讀入的所有變量的位址, 而不是變量本身。這與printf()函數

完全不同, 要特别注意。各個變量的位址之間同","分開。

例2:

main()

{

int i, j;

printf("i, j=? ");

scanf("%d, %d", &i, &j);

}

上例中的scanf()函數先讀一個整型數, 然後把接着輸入的逗号剔除掉, 最

後讀入另一個整型數。如果","這一特定字元沒有找到, scanf()函數就終止。若

參數之間的分隔符為空格, 則參數之間必須輸入一個或多個空格。

說明:

(1). 對于字元串數組或字元串指針變量, 由于數組名和指針變量名本身就

是位址, 是以使用scanf()函數時, 不需要在它們前面加上"&"操作符。

例3

mian()

{

char *p, str[20];

scanf("%s", p);

scanf("%s", str);

printf("%s ", p);

printf("%s ", str);

}

(2). 可以在格式化字元串中的"%"各格式化規定符之間加入一個整數, 表示

任何讀操作中的最大位數。

如例3中若規定隻能輸入10字元給字元串指針p, 則第一條scanf() 函數語句

變為

scanf("%10s", p);

程式運作時一旦輸入字元個數大于10, p就不再繼續讀入, 而後面的一個讀

入函數即scanf("%s", str)就會從第11個字元開始讀入。

實際使用scanf()函數時存在一個問題, 下面舉例進行說明:

當使用多個scanf()函數連續給多個字元變量輸入時, 例如:

main()

{

char c1, c2;

scanf("%c", &c1);

scanf("%c", &c2);

printf("c1 is %c, c2 is %c", c21, c2);

}

運作該程式, 輸入一個字元A後回車 (要完成輸入必須回車), 在執行scanf

("%c", &c1)時, 給變量c1指派"A", 但回車符仍然留在緩沖區内, 執行輸入語句

scanf("%c", &c2)時, 變量c2輸出的是一空行, 如果輸入AB後回車, 那麼輸出結

果為: c1 is A, c2 is B。

要解決以上問題, 可以在輸入函數前加入清除函數fflush()( 這個函數的使

用方法将在本節最後講述)。修改以上程式變成:

#include

main()

{

char c1, c2;

scanf("%c", &c1);

fflush(stdin);

scanf("%c", &c2);

printf("c1 is %c, c2 is %c", c1, c2);

}

1.1.2 非格式化輸入輸出函數

非格式化輸入輸出函數可以由上面講述的标準格式化輸入輸出函數代替, 但

這些函數編譯後代碼少, 相對占用記憶體也小, 進而提高了速度, 同時使用也比較

友善。下面分别進行介紹。

一、puts()和gets()函數

1. puts()函數

puts()函數用來向标準輸出裝置(螢幕)寫字元串并換行, 其調用格式為:

puts(s);

其中s為字元串變量(字元串數組名或字元串指針)。

puts()函數的作用與語printf("%s ", s)相同。

例4:

main()

{

char s[20], *f;

strcpy(s, "Hello!");

f="Thank you";

puts(s);

puts(f);

}

說明:

(1). puts()函數隻能輸出字元串, 不能輸出數值或進行格式變換。

(2). 可以将字元串直接寫入puts()函數中。如:

puts("Hello, Turbo C2.0");

2. gets()函數

gets()函數用來從标準輸入裝置(鍵盤)讀取字元串直到回車結束, 但回車符

不屬于這個字元串。其調用格式為:

gets(s);

其中s為字元串變量(字元串數組名或字元串指針)。

gets(s)函數與scanf("%s", &s)相似, 但不完全相同, 使用scanf("%s", &s)

函數輸入字元串時存在一個問題, 就是如果輸入了空格會認為輸入字元串結束,

空格後的字元将作為下一個輸入項處理, 但gets() 函數将接收輸入的整個字元

串直到回車為止。

例5

main()

{

char s[20], *f;

printf("What's your name? ");

gets(s);

puts(s);

puts("How old are you?");

gets(f);

puts(f);

} [@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9650775/viewspace-923206/,如需轉載,請注明出處,否則将追究法律責任。

轉載于:http://blog.itpub.net/9650775/viewspace-923206/