詳解C語(yǔ)言中printf輸出的相關(guān)函數(shù)
C語(yǔ)言printf()函數(shù):格式化輸出函數(shù)
printf()函數(shù)是最常用的格式化輸出函數(shù),其原型為:
int printf( char * format, ... );
printf()會(huì)根據(jù)參數(shù) format 字符串來(lái)轉(zhuǎn)換并格式化數(shù)據(jù),然后將結(jié)果輸出到標(biāo)準(zhǔn)輸出設(shè)備(顯示器),直到出現(xiàn)字符串結(jié)束('\0')為止。
參數(shù) format 字符串可包含下列三種字符類型:
- 一般文本,將會(huì)直接輸出
- ASCII 控制字符,如\t、\n 等有特定含義
- 格式轉(zhuǎn)換字符
格式轉(zhuǎn)換為一個(gè)百分比符號(hào)(%)及其后的格式字符所組成。一般而言,每個(gè)%符號(hào)在其后都必需有一個(gè)參數(shù)與之相呼應(yīng)(只有當(dāng)%%轉(zhuǎn)換字符出現(xiàn)時(shí)會(huì)直接輸出%字符),而欲輸出的數(shù)據(jù)類型必須與其相對(duì)應(yīng)的轉(zhuǎn)換字符類型相同。
printf()格式轉(zhuǎn)換的一般形式如下:
%(flags)(width)(. prec)type
以括號(hào)括起來(lái)的參數(shù)為選擇性參數(shù),而%與type 則是必要的,下面介紹 type 的幾種形式。
1) 整數(shù)
- %d 整數(shù)的參數(shù)會(huì)被轉(zhuǎn)成有符號(hào)的十進(jìn)制數(shù)字
- %u 整數(shù)的參數(shù)會(huì)被轉(zhuǎn)成無(wú)符號(hào)的十進(jìn)制數(shù)字
- %o 整數(shù)的參數(shù)會(huì)被轉(zhuǎn)成無(wú)符號(hào)的八進(jìn)制數(shù)字
- %x 整數(shù)的參數(shù)會(huì)被轉(zhuǎn)成無(wú)符號(hào)的十六進(jìn)制數(shù)字,并以小寫(xiě)abcdef 表示
- %X 整數(shù)的參數(shù)會(huì)被轉(zhuǎn)成無(wú)符號(hào)的十六進(jìn)制數(shù)字,并以大寫(xiě)ABCDEF 表示浮點(diǎn)型數(shù)
- %f double 型的參數(shù)會(huì)被轉(zhuǎn)成十進(jìn)制數(shù)字,并取到小數(shù)點(diǎn)以下六位,四舍五入
- %e double 型的參數(shù)以指數(shù)形式打印,有一個(gè)數(shù)字會(huì)在小數(shù)點(diǎn)前,六位數(shù)字在小數(shù)點(diǎn)后,而在指數(shù)部分會(huì)以小寫(xiě)的e 來(lái)表示
- %E 與%e 作用相同,唯一區(qū)別是指數(shù)部分將以大寫(xiě)的E 來(lái)表示
- %g double 型的參數(shù)會(huì)自動(dòng)選擇以%f 或%e 的格式來(lái)打印,其標(biāo)準(zhǔn)是根據(jù)打印的數(shù)值及所設(shè)置的有效位數(shù)來(lái)決定。
- %G 與%g 作用相同,唯一區(qū)別在以指數(shù)形態(tài)打印時(shí)會(huì)選擇%E 格式。
2) 字符及字符串
- %c 整型數(shù)的參數(shù)會(huì)被轉(zhuǎn)成unsigned char 型打印出
- %s 指向字符串的參數(shù)會(huì)被逐字輸出,直到出現(xiàn)NULL 字符為止
- %p 如果是參數(shù)是"void *"型指針則使用十六進(jìn)制格式顯示
prec 有幾種情況:
- 正整數(shù)的最小位數(shù)
- 在浮點(diǎn)型數(shù)中代表小數(shù)位數(shù)
- 格式代表有效位數(shù)的最大值
- 在%s 格式代表字符串的最大長(zhǎng)度
- 若為×符號(hào)則代表下個(gè)參數(shù)值為最大長(zhǎng)度
width 為參數(shù)的最小長(zhǎng)度,若此欄并非數(shù)值,而是*符號(hào),則表示以下一個(gè)參數(shù)當(dāng)做參數(shù)長(zhǎng)度。
flags 有下列幾種情況
- + 一般在打印負(fù)數(shù)時(shí),printf ()會(huì)加印一個(gè)負(fù)號(hào),整數(shù)則不加任何負(fù)號(hào),此旗標(biāo)會(huì)使得在打印正數(shù)前多一個(gè)正號(hào) (+)。
- # 此旗標(biāo)會(huì)根據(jù)其后轉(zhuǎn)換字符的不同而有不同含義。當(dāng)在類型為o 之前 (如%#o),則會(huì)在打印八進(jìn)制數(shù)值前多印一個(gè)o。而在類型為x 之前 (%#x)則會(huì)在打印十六進(jìn)制數(shù)前多印'0x',在型態(tài)為e、E、f、g 或G 之前則會(huì)強(qiáng)迫數(shù)值打印小數(shù)點(diǎn)。在類型為g 或G 之前時(shí)則同時(shí)保留小數(shù)點(diǎn)及小數(shù)位數(shù)末尾的零。
- 0 當(dāng)有指定參數(shù)時(shí),無(wú)數(shù)字的參數(shù)將補(bǔ)上0。默認(rèn)是關(guān)閉此旗標(biāo),所以一般會(huì)打印出空白字符。
【返回值】成功則返回寫(xiě)入的字符數(shù)目。
如果發(fā)生寫(xiě)入錯(cuò)誤,將會(huì)設(shè)置文件錯(cuò)誤標(biāo)志(可通過(guò) ferror() 檢測(cè)),并返回一個(gè)負(fù)數(shù)。
如果在寫(xiě)入寬字符時(shí)一個(gè)多字節(jié)的字符發(fā)生編碼錯(cuò)誤,那么 errno 將被設(shè)置為 EILSEQ,并返回一個(gè)負(fù)數(shù)。
printf( format, ... ) 等價(jià)于 fprintf(stdout, format, ...),更多信息請(qǐng)參考 fprintf() 函數(shù)。
【實(shí)例】分別輸出整數(shù)、浮點(diǎn)數(shù)和字符串。
#include<stdio.h> int main(void) { int a=1; float b=5.0; char str[100]= ""; scanf("%c %c %c",&a,&b,str); /*分別演示 整數(shù)*/ printf("int is:%d\n",a); /*分別演示 浮點(diǎn)數(shù)*/ printf("float is:%f\n",b); /*分別演示 字符串*/ printf("char is:%s\n",str); return 0; }
輸出結(jié)果:
【運(yùn)行結(jié)果】
1 4.4 fs int is:1 float is:4.400000 char is:fs
例子首先是等待用戶輸入整數(shù)浮點(diǎn)數(shù)和一個(gè)字符串,然后調(diào)用函數(shù)printf()按照對(duì)應(yīng)的格式輸出。
又如,輸出更多格式的數(shù)據(jù)。
#include <stdio.h> int main() { printf ("Characters: %c %c \n", 'a', 65); printf ("Decimals: %d %ld\n", 1977, 650000L); printf ("Preceding with blanks: %10d \n", 1977); printf ("Preceding with zeros: %010d \n", 1977); printf ("Some different radices: %d %x %o %#x %#o \n", 100, 100, 100, 100, 100); printf ("floats: %4.2f %+.0e %E \n", 3.1416, 3.1416, 3.1416); printf ("Width trick: %*d \n", 5, 10); printf ("%s \n", "A string"); return 0; }
輸出結(jié)果:
Characters: a A Decimals: 1977 650000 Preceding with blanks: 1977 Preceding with zeros: 0000001977 Some different radices: 100 64 144 0x64 0144 floats: 3.14 +3e+000 3.141600E+000 Width trick: 10 A string
C語(yǔ)言fprintf()函數(shù):輸出函數(shù)(格式化輸出數(shù)據(jù)至文件)
頭文件:
#include <stdio.h>
定義函數(shù):
int fprintf(FILE * stream, const char * format, ...);
函數(shù)說(shuō)明:fprintf()會(huì)根據(jù)參數(shù)format 字符串來(lái)轉(zhuǎn)換并格式化數(shù)據(jù), 然后將結(jié)果輸出到參數(shù)stream 指定的文件中, 直到出現(xiàn)字符串結(jié)束('\0')為止。
返回值:關(guān)于參數(shù)format 字符串的格式請(qǐng)參考printf(). 成功則返回實(shí)際輸出的字符數(shù), 失敗則返回-1, 錯(cuò)誤原因存于errno 中.
范例
#include <stdio.h> main() { int i = 150; int j = -100; double k = 3.14159; fprintf(stdout, "%d %f %x \n", j, k, i); fprintf(stdout, "%2d %*d\n", i, 2, i); }
執(zhí)行:
-100 3.141590 96 150 150
C語(yǔ)言sprintf()函數(shù):將格式化的數(shù)據(jù)寫(xiě)入字符串
頭文件:
#include <stdio.h>
sprintf()函數(shù)用于將格式化的數(shù)據(jù)寫(xiě)入字符串,其原型為:
int sprintf(char *str, char * format [, argument, ...]);
【參數(shù)】str為要寫(xiě)入的字符串;format為格式化字符串,與printf()函數(shù)相同;argument為變量。
除了前兩個(gè)參數(shù)類型固定外,后面可以接任意多個(gè)參數(shù)。而它的精華,顯然就在第二個(gè)參數(shù)--格式化字符串--上。 printf()和sprintf()都使用格式化字符串來(lái)指定串的格式,在格式串內(nèi)部使用一些以“%”開(kāi)頭的格式說(shuō)明符(format specifications)來(lái)占據(jù)一個(gè)位置,在后邊的變參列表中提供相應(yīng)的變量,最終函數(shù)就會(huì)用相應(yīng)位置的變量來(lái)替代那個(gè)說(shuō)明符,產(chǎn)生一個(gè)調(diào)用者想要的字符串。
sprintf()最常見(jiàn)的應(yīng)用之一莫過(guò)于把整數(shù)打印到字符串中,如:
- sprintf(s, "%d", 123); //把整數(shù)123打印成一個(gè)字符串保存在s中
- sprintf(s, "%8x", 4567); //小寫(xiě)16進(jìn)制,寬度占8個(gè)位置,右對(duì)齊
sprintf的作用是將一個(gè)格式化的字符串輸出到一個(gè)目的字符串中,而printf是將一個(gè)格式化的字符串輸出到屏幕。sprintf的第一個(gè)參數(shù)應(yīng)該是目的字符串,如果不指定這個(gè)參數(shù),執(zhí)行過(guò)程中出現(xiàn) "該程序產(chǎn)生非法操作,即將被關(guān)閉...."的提示。
sprintf()會(huì)根據(jù)參數(shù)format 字符串來(lái)轉(zhuǎn)換并格式化數(shù)據(jù),然后將結(jié)果復(fù)制到參數(shù)str 所指的字符串?dāng)?shù)組,直到出現(xiàn)字符串結(jié)束('\0')為止。關(guān)于參數(shù)format 字符串的格式請(qǐng)參考printf()。
【返回值】成功則返回參數(shù)str 字符串長(zhǎng)度,失敗則返回-1,錯(cuò)誤原因存于errno 中。
注意:C語(yǔ)言對(duì)數(shù)組進(jìn)行操作時(shí)并不檢測(cè)數(shù)組的長(zhǎng)度,如果str的長(zhǎng)度不夠,sprintf()很容易造成緩沖區(qū)溢出,帶來(lái)意想不到的后果,黑客經(jīng)常利用這個(gè)弱點(diǎn)攻擊看上去安全的系統(tǒng)。請(qǐng)看下面的代碼:
#include <stdio.h> main() { char buf[10]; sprintf(buf, "The length of the string is more than 10"); printf("%s", buf); }
編譯并運(yùn)行,屏幕上輸出”The length of the string is more than 10“,同時(shí)系統(tǒng)提示程序已經(jīng)停止。原因就是要寫(xiě)入的字符串的長(zhǎng)度超過(guò)了buf的長(zhǎng)度,造成緩沖區(qū)溢出。
使用snprintf()來(lái)代替sprintf()將能夠很好的解決這個(gè)問(wèn)題。
【實(shí)例】打印字母a的ASCII值。
#include <stdio.h> main() { char a = 'a'; char buf[80]; sprintf(buf, "The ASCII code of a is %d.", a); printf("%s", buf); }
運(yùn)行結(jié)果:
The ASCII code of a is 97.
又如,產(chǎn)生10個(gè)100以內(nèi)的隨機(jī)數(shù)并輸出。
#include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { char str[100]; int offset =0; int i=0; srand(time(0)); // *隨機(jī)種子 for(i = 0;i<10;i++) { offset+=sprintf(str+offset,"%d,",rand()%100); // 格式化的數(shù)據(jù)寫(xiě)入字符串 } str[offset-1]='\n'; printf(str); return 0; }
運(yùn)行結(jié)果:
74,43,95,95,44,90,70,23,66,84
例子使用了一個(gè)新函數(shù)srand(),它能產(chǎn)生隨機(jī)數(shù)。例子中最復(fù)雜的部分是for循環(huán)中每次調(diào)用函數(shù)sprintf()往字符數(shù)組寫(xiě)數(shù)據(jù)的時(shí)候,str+foffset為每次寫(xiě)入數(shù)據(jù)的開(kāi)始地址,最終的結(jié)果是所有產(chǎn)生的隨機(jī)數(shù)據(jù)都被以整數(shù)的形式存入數(shù)組中。
上一篇:簡(jiǎn)單介紹C語(yǔ)言中的umask()函數(shù)和truncate()函數(shù)
欄 目:C語(yǔ)言
下一篇:詳解C語(yǔ)言中symlink()函數(shù)和readlink()函數(shù)的使用
本文標(biāo)題:詳解C語(yǔ)言中printf輸出的相關(guān)函數(shù)
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2789.html
您可能感興趣的文章
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用函數(shù)刪除字符
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)式函數(shù)庫(kù)
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段函數(shù)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排序法函數(shù)
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段函數(shù)
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求階乘


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載