又是一篇做備忘的文檔,從網(wǎng)上轉(zhuǎn)了3篇來,可以夠詳細(xì)得說明這個問題了:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
原文地址:http://www.c51bbs.com/c51bbs/topic1/c51bbs110497.htm
本節(jié)主要介紹Turbo?C2.0標(biāo)準(zhǔn)輸入輸出函數(shù)和文件的輸入輸出函數(shù)。
????1.1??標(biāo)準(zhǔn)輸入輸出函數(shù)?
????1.1.1?格式化輸入輸出函數(shù)?
????Turbo?C2.0?標(biāo)準(zhǔn)庫提供了兩個控制臺格式化輸入、?輸出函數(shù)printf(?)?和?
scanf(),?這兩個函數(shù)可以在標(biāo)準(zhǔn)輸入輸出設(shè)備上以各種不同的格式讀寫數(shù)據(jù)。?
printf()函數(shù)用來向標(biāo)準(zhǔn)輸出設(shè)備(屏幕)寫數(shù)據(jù);?scanf()?函數(shù)用來從標(biāo)準(zhǔn)輸入?
設(shè)備(鍵盤)上讀數(shù)據(jù)。下面詳細(xì)介紹這兩個函數(shù)的用法。?
????一、printf()函數(shù)?
????printf()函數(shù)是格式化輸出函數(shù),?一般用于向標(biāo)準(zhǔn)輸出設(shè)備按規(guī)定格式輸出?
信息。在編寫程序時經(jīng)常會用到此函數(shù)。printf()函數(shù)的調(diào)用格式為:?
??????printf("<格式化字符串>",?<參量表>);?
????其中格式化字符串包括兩部分內(nèi)容:?一部分是正常字符,??這些字符將按原?
樣輸出;?另一部分是格式化規(guī)定字符,?以"%"開始,?后跟一個或幾個規(guī)定字符,?
用來確定輸出內(nèi)容格式。?
????參量表是需要輸出的一系列參數(shù),?其個數(shù)必須與格式化字符串所說明的輸出?
參數(shù)個數(shù)一樣多,?各參數(shù)之間用","分開,?且順序一一對應(yīng),??否則將會出現(xiàn)意想?
不到的錯誤。?
????1.?格式化規(guī)定符?
????Turbo?C2.0提供的格式化規(guī)定符如下:?
━━━━━━━━━━━━━━━━━━━━━━━━━━?
???符號??????????????????作用?
──────────────────────────?
????%d??????????????十進(jìn)制有符號整數(shù)?
????%u??????????????十進(jìn)制無符號整數(shù)?
????%f??????????????浮點(diǎn)數(shù)?
????%s??????????????字符串?
????%c??????????????單個字符?
????%p??????????????指針的值?
????%e??????????????指數(shù)形式的浮點(diǎn)數(shù)?
????%x,?%X??????????無符號以十六進(jìn)制表示的整數(shù)?
????%0??????????????無符號以八進(jìn)制表示的整數(shù)?
????%g??????????????自動選擇合適的表示法?
━━━━━━━━━━━━━━━━━━━━━━━━━━?
????說明:?
????(1).?可以在"%"和字母之間插進(jìn)數(shù)字表示最大場寬。?
?????例如:??%3d???表示輸出3位整型數(shù),?不夠3位右對齊。?
????????????%9.2f?表示輸出場寬為9的浮點(diǎn)數(shù),?其中小數(shù)位為2,?整數(shù)位為6,?
??????????????????小數(shù)點(diǎn)占一位,?不夠9位右對齊。?
????????????%8s???表示輸出8個字符的字符串,?不夠8個字符右對齊。?
????如果字符串的長度、或整型數(shù)位數(shù)超過說明的場寬,?將按其實(shí)際長度輸出。?
但對浮點(diǎn)數(shù),?若整數(shù)部分位數(shù)超過了說明的整數(shù)位寬度,?將按實(shí)際整數(shù)位輸出;?
若小數(shù)部分位數(shù)超過了說明的小數(shù)位寬度,?則按說明的寬度以四舍五入輸出。?
????另外,?若想在輸出值前加一些0,?就應(yīng)在場寬項前加個0。?
????例如:???%04d??表示在輸出一個小于4位的數(shù)值時,?將在前面補(bǔ)0使其總寬度?
為4位。?
????如果用浮點(diǎn)數(shù)表示字符或整型量的輸出格式,?小數(shù)點(diǎn)后的數(shù)字代表最大寬度,?
小數(shù)點(diǎn)前的數(shù)字代表最小寬度。?
????例如:?%6.9s?表示顯示一個長度不小于6且不大于9的字符串。若大于9,??則?
第9個字符以后的內(nèi)容將被刪除。?
????(2).?可以在"%"和字母之間加小寫字母l,?表示輸出的是長型數(shù)。?
????例如:???%ld???表示輸出long整數(shù)?
????????????%lf???表示輸出double浮點(diǎn)數(shù)?
????(3).?可以控制輸出左對齊或右對齊,?即在"%"和字母之間加入一個"-"?號可?
說明輸出為左對齊,?否則為右對齊。?
????例如:???%-7d??表示輸出7位整數(shù)左對齊?
????????????%-10s?表示輸出10個字符左對齊?
????2.?一些特殊規(guī)定字符?
━━━━━━━━━━━━━━━━━━━━━━━━━━?
????字符???????????????????????????作用?
──────────────────────────?
?????\n???????????????????換行?
?????\f???????????????????清屏并換頁?
?????\r???????????????????回車?
?????\t???????????????????Tab符?
?????\xhh?????????????????表示一個ASCII碼用16進(jìn)表示,?
??????????????????????????其中hh是1到2個16進(jìn)制數(shù)?
━━━━━━━━━━━━━━━━━━━━━━━━━━?
????由本節(jié)所學(xué)的printf()函數(shù),?并結(jié)合上一節(jié)學(xué)習(xí)的數(shù)據(jù)類型,?編制下面的程?
序,?以加深對Turbo?C2.0數(shù)據(jù)類型的了解。?
????例1?
?????#include<stdio.h>?
?????#include<string.h>?
?????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\n",?a);?????/*結(jié)果輸出十進(jìn)制整數(shù)a=1234*/?
??????????printf("a=%6d\n",?a);????/*結(jié)果輸出6位十進(jìn)制數(shù)a=??1234*/?
??????????printf("a=%06d\n",?a);???/*結(jié)果輸出6位十進(jìn)制數(shù)a=001234*/?
??????????printf("a=%2d\n",?a);????/*a超過2位,?按實(shí)際值輸出a=1234*/?
??????????printf("*i=%4d\n",?*i);??/*輸出4位十進(jìn)制整數(shù)*i=??12*/?
??????????printf("*i=%-4d\n",?*i);?/*輸出左對齊4位十進(jìn)制整數(shù)*i=12*/?
??????????printf("i=%p\n",?i);?????/*輸出地址i=06E4*/?
??????????printf("f=%f\n",?f);?????/*輸出浮點(diǎn)數(shù)f=3.141593*/?
??????????printf("f=6.4f\n",?f);???/*輸出6位其中小數(shù)點(diǎn)后4位的浮點(diǎn)數(shù)?
??????????????????????????????????????f=3.1416*/?
??????????printf("x=%lf\n",?x);????/*輸出長浮點(diǎn)數(shù)x=0.123457*/?
??????????printf("x=%18.16lf\n",?x);/*輸出18位其中小數(shù)點(diǎn)后16位的長浮點(diǎn)?
??????????????????????????????????????數(shù)x=0.1234567898765432*/?
??????????printf("c=%c\n",?c);?????/*輸出字符c=A*/?
??????????printf("c=%x\n",?c);?????/*輸出字符的ASCII碼值c=41*/?
??????????printf("s[]=%s\n",?s);???/*輸出數(shù)組字符串s[]=Hello,?Comrade*/?
??????????printf("s[]=%6.9s\n",?s);/*輸出最多9個字符的字符串s[]=Hello,?
?????????????????????????????????????Co*/?
??????????printf("s=%p\n",?s);?????/*輸出數(shù)組字符串首字符地址s=FFBE*/?
??????????printf("*p=%s\n",?p);????/*?輸出指針字符串p=How?do?you?do*/?
??????????printf("p=%p\n",?p);?????/*輸出指針的值p=0194*/?
??????????getch();?
??????????retunr?0;?
?????}?
????上面結(jié)果中的地址值在不同計算機(jī)上可能不同。?
????例1.中第一條語句#include<stdio.h>的含義是調(diào)用另一個文件stdio.h,?這?
是一個頭文件,?其中包括全部標(biāo)準(zhǔn)輸入輸出庫函數(shù)的數(shù)據(jù)類型定義和函數(shù)說明。?
Turbo?C2.0對每個庫函數(shù)便用的變量及函數(shù)類型都已作了定義與說明,?放在相應(yīng)?
頭文件"*.h"中,?用戶用到這些函數(shù)時必須要用#include<*.h>或#include"*.?h"?
語句調(diào)用相應(yīng)的頭文件,?以供連接。若沒有用此語句說明,?則連接時將會出現(xiàn)錯?
誤。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
原文地址:http://blog.chinaunix.net/u/311/showart_259021.html
printf 格式化輸出 | 格式代碼 | A | ABC | ABCDEFGH |
| %S | A | ABC | ABCDEFGH |
| %5S | ####A | ##ABC | ABCDEFGH |
| %.5S | A | ABC | ABCDE |
| %5.5S | ####A | ##ABC | ABCDE |
| %-5S | A#### | ABC## | ABCDEFGH |
??????????????????????????????????????? Printf 格式化字符串 | 格式代碼 | 1 | -12 | 12345 | 123456789 |
| %d | 1 | -12 | 12345 | 123456789 |
| %6d | #####1 | ###-12 | #12345 | 123456789 |
| %.4d | 0001 | -0012 | 12345 | 123456789 |
| %6.4d | ##0001 | #-0012 | #12345 | 123456789 |
| %-4d | 1#### | -12# | 12345 | 123456789 |
| %04d | 0001 | -012 | 12345 | 123456789 |
| %+d | +1 | -12 | +12345 | +123456789 |
??????????????????????????????????????? Printf格式化整型數(shù)值 | 格式代碼 | 1 | .01 | .00012345 | 12345.6789 |
| %f | 1.000000 | 0.010000 | 0.000123 | 12345.678900 |
| %10.2d | ######1.00 | #####0.01 | ######0.00 | ##12345.67 |
| %e | 1.000000e+00 | 1.000000e-02 | 1.234500e-04 | 1.234568e+04 |
| %.4e | 1.0000e+00 | 1.0000e-02 | 1.2345e-04 | 1.2346e+04 |
| %g | 1 | 0.01 | 0.00012345 | 12345.7 |
| 格式代碼 | 6.023e23 |
| %f | 60229999999999975882752.000000 |
| %10.2e | 60229999999999975882752.00 |
| %e | 6.023000e+23 |
| %.4e | 6.0230e+23 |
| %g | 6.023e+23 |
??????????????????????????????????????? Printf格式化浮點(diǎn)值 printf()格式轉(zhuǎn)換的一般形式如下
%(flags)(width)(.prec)type
以中括號括起來的參數(shù)為選擇性參數(shù),而%與type則是必要的。底下先介紹type的幾種形式
整數(shù)
%d 整數(shù)的參數(shù)會被轉(zhuǎn)成一有符號的十進(jìn)制數(shù)字
%u 整數(shù)的參數(shù)會被轉(zhuǎn)成一無符號的十進(jìn)制數(shù)字
%o 整數(shù)的參數(shù)會被轉(zhuǎn)成一無符號的八進(jìn)制數(shù)字
%x 整數(shù)的參數(shù)會被轉(zhuǎn)成一無符號的十六進(jìn)制數(shù)字,并以小寫abcdef表示
%X 整數(shù)的參數(shù)會被轉(zhuǎn)成一無符號的十六進(jìn)制數(shù)字,并以大寫ABCDEF表示浮點(diǎn)型數(shù)
%f double 型的參數(shù)會被轉(zhuǎn)成十進(jìn)制數(shù)字,并取到小數(shù)點(diǎn)以下六位,四舍五入。
%e double型的參數(shù)以指數(shù)形式打印,有一個數(shù)字會在小數(shù)點(diǎn)前,六位數(shù)字在小數(shù)點(diǎn)后,而在指數(shù)部分會以小寫的e來表示。
%E 與%e作用相同,唯一區(qū)別是指數(shù)部分將以大寫的E 來表示。
%g double 型的參數(shù)會自動選擇以%f 或%e 的格式來打印,其標(biāo)準(zhǔn)是根據(jù)欲打印的數(shù)值及所設(shè)置的有效位數(shù)來決定。
%G 與%g 作用相同,唯一區(qū)別在以指數(shù)形態(tài)打印時會選擇%E 格式。
字符及字符串
%c 整型數(shù)的參數(shù)會被轉(zhuǎn)成unsigned char型打印出。
%s 指向字符串的參數(shù)會被逐字輸出,直到出現(xiàn)NULL字符為止
%p 如果是參數(shù)是“void *”型指針則使用十六進(jìn)制格式顯示。
prec 有幾種情況
1. 正整數(shù)的最小位數(shù)。
2. 在浮點(diǎn)型數(shù)中代表小數(shù)位數(shù)
3. 在%g 格式代表有效位數(shù)的最大值。
4. 在%s格式代表字符串的最大長度。
5. 若為×符號則代表下個參數(shù)值為最大長度。
width為參數(shù)的最小長度,若此欄并非數(shù)值,而是*符號,則表示以下一個參數(shù)當(dāng)做參數(shù)長度。
flags 有下列幾種情況
#NAME?
+ 一般在打印負(fù)數(shù)時,printf( )會加印一個負(fù)號,整數(shù)則不加任何負(fù)號。此旗標(biāo)會使得在打印正數(shù)前多一個正號(+)。
# 此旗標(biāo)會根據(jù)其后轉(zhuǎn)換字符的不同而有不同含義。當(dāng)在類型為o 之前(如%#o),則會在打印八進(jìn)制數(shù)值前多印一個o。
而在類型為x 之前(%#x)則會在打印十六進(jìn)制數(shù)前多印’0x’,在型態(tài)為e、E、f、g或G 之前則會強(qiáng)迫數(shù)值打印小數(shù)點(diǎn)。在類型為g 或G之前時則同時保留小數(shù)點(diǎn)及小數(shù)位數(shù)末尾的零。
0 當(dāng)有指定參數(shù)時,無數(shù)字的參數(shù)將補(bǔ)上0。默認(rèn)是關(guān)閉此旗標(biāo),所以一般會打印出空白字符。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~3~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
原文地址:http://www.chinaunix.net/jh/23/24825.html
[精華] gcc中格式化輸出函數(shù)的研究(轉(zhuǎn))
|
|
| http://www.chinaunix.net 作者:HopeCao??發(fā)表于:2003-09-23 13:17:24 |
| 【發(fā)表評論】 【查看原文】 【C/C++討論區(qū)】【關(guān)閉】 |
By?書生
<一>;
1.前言
在gcc編程中,我們比較經(jīng)常用到的字符格式化輸出函數(shù)是printf的,實(shí)際上gcc繼承了c語言處理字符具有強(qiáng)大功能的風(fēng)格,它提供了一系列的格式化輸出函數(shù),主要存在兩個庫函數(shù)文件stdio.h/?stdarg.h中,具體函數(shù)如下:
#include?
printf,?int?printf(const?char?*format,?...);
fprintf,?int?fprintf(FILE?*stream,?const?char?*format,?...);
sprintf,?int?sprintf(char?*str,?const?char?*format,?...);
snprintf,?int?snprintf(char?*str,?size_t?size,?const?char?*format,?...);
#include?
vprintf,?vprintf(const?char?*format,?va_list?ap);
vfprintf,?vfprintf(FILE?*stream,?const?char?*format,?va_list?ap);
vsprintf,?int?vsprintf(char?*str,?const?char?*format,?va_list?ap);
其中:
printf和vprintf函數(shù)主要是向一個標(biāo)準(zhǔn)輸出設(shè)備或標(biāo)準(zhǔn)的字符流輸出格式化后的字符。
Fprintf和vfprintf?函數(shù)主要是向一個給定的字符流設(shè)備輸出格式化后的字符。
而sprintf,?snprintf,?vsprintf?和vsnprintf函數(shù)則是將格式化后的結(jié)果賦值給一個字符串。
雖然函數(shù)的功能上有差異,返回的值的類型也不盡相同,但是在建立匹配格式的語法上還是相同的,這幾個函數(shù)都有一些共同特征,就是你要設(shè)計好模板和格式化的字串。這些函數(shù)格式化字符串的命令主要是通過模板字符串中跟在“%”后面的字符來控制的。
如下一個例子中:
int?pct?=?37;
char?filename[]?=?"foo.txt";
printf?("Processing?of?`%s'?is?%d%%?finished.Please?be?patient.",filename,?pct);
顯然,這個例子的打印結(jié)果就是如下:
Processing?of?`foo.txt'?is?37%?finished.Please?be?patient.
如上例子我們可以看出一般格式化函數(shù)的語法特點(diǎn)就是包含格式化匹配的字符串,輸出的字串和變量組合的結(jié)構(gòu)。
2.參數(shù)詳細(xì)介紹
由于大部分函數(shù)在如何格式化字串部分的語法非常相似,我們先研究他們的共同特點(diǎn),然后再應(yīng)用不同的例子來分析其不同特點(diǎn):此類函數(shù)一般的調(diào)用格式為:printf("<格式化字符串>;",?<參量表>;);
其中格式化字符串包括兩部分內(nèi)容:?一部分是正常字符,?這些字符將按原樣輸出;?另一部分是格式化規(guī)定字符,?以"%"開始,?后跟一個或 幾個規(guī)定字符,用來確定輸出內(nèi)容格式。參量表是需要輸出的一系列參數(shù),?其個數(shù)必須與格式化字符串所說明的輸出參數(shù)個數(shù)一樣多,?各參數(shù)之間用","分 開,?且順序一一對應(yīng),?否則將會出現(xiàn)意想不到的錯誤。?
2.1?Gcc提供的格式化規(guī)定符如下:
%d? 十進(jìn)制有符號整數(shù)
%i? 十進(jìn)制有符號整數(shù)
注:上面這兩個函數(shù)在格式化輸出時用途是相同的,但在輸入時卻是不一樣的,%i可以接受任何形式的整數(shù),而%d卻不能。
%u? 十進(jìn)制無符號整數(shù)
%f? 輸出浮點(diǎn)數(shù)
%s? 輸出字符串
%c? 輸出單個字符
%p? 輸出指針的值
%e?%E? 指數(shù)形式的浮點(diǎn)數(shù)?,其中:%e是以小寫形式輸出的?%E是以大寫形式輸出的
%x,?%X? 無符號以十六進(jìn)制表示的整數(shù),其中:%x是以小寫形式輸出的?%X是以大寫形式輸出的
`%g',?`%G'? 根據(jù)輸出數(shù)據(jù)的大小需要決定用普通形式還是指數(shù)形式的輸出方式,其中:?%g是以小寫形式輸出的?%G是以大寫形式輸出的
%o? 無符號以八進(jìn)制表示的整數(shù)
`%c? '輸出單個字符
%n? 得到輸出字符的個數(shù),但是本參數(shù)不產(chǎn)生任何的輸出效果。
`%m'? 輸出錯誤時的相應(yīng)的字符串提示。
`%%'? 輸出正文字符中的“%”字符
說明:
可以在"%"和字母之間插進(jìn)數(shù)字表示最大場寬。例如:?%3d?表示輸出3位整型數(shù),?不夠3位右對齊。%9.2f?表示輸出場寬為9的浮點(diǎn)數(shù), ?其中小數(shù)位為2,?整數(shù)位為6,小數(shù)點(diǎn)占一位,?不夠9位右對齊。%8s?表示輸出8個字符的字符串,?不夠8個字符右對齊。如果字符串的長度、或整型 數(shù)位數(shù)超過說明的場寬,?將按其實(shí)際長度輸出。但對浮點(diǎn)數(shù),?若整數(shù)部分位數(shù)超過了說明的整數(shù)位寬度,?將按實(shí)際整數(shù)位輸出;若小數(shù)部分位數(shù)超過了說明的 小數(shù)位寬度,?則按說明的寬度以四舍五入輸出。另外,?若想在輸出值前加一些0,?就應(yīng)在場寬項前加個0。例如:?%04d?表示在輸出一個小于4位的數(shù) 值時,?將在前面補(bǔ)0使其總寬度為4位。如果用浮點(diǎn)數(shù)表示字符或整型量的輸出格式,?小數(shù)點(diǎn)后的數(shù)字代表最大寬度,小數(shù)點(diǎn)前的數(shù)字代表最小寬度。? 例如:?%6.9s?表示顯示一個長度不小于6且不大于9的字符串。若大于9,?則第9個字符以后的內(nèi)容將被刪除。
可以在"%"和字母之間加小寫字母l,?表示輸出的是長型數(shù)。? 例如:?%ld?表示輸出long整數(shù)%lf?表示輸出double浮點(diǎn)數(shù)
可以控制輸出左對齊或右對齊,?即在"%"和字母之間加入一個"-"?號可? 說明輸出為左對齊,?否則為右對齊。例如:?%-7d?表示輸出7位整數(shù)左對齊%-10s表示輸出10個字符左對齊
2.2?一些特殊規(guī)定字符
換行? f?清屏并換頁? 回車? Tab符? xhh?表示一個ASCII碼用16進(jìn)表示,其中hh是1到2個16進(jìn)制數(shù)
?HopeCao 回復(fù)于:2003-02-28 13:14:31
<二>;
3.格式化轉(zhuǎn)換的具體細(xì)則
3.1?整數(shù)轉(zhuǎn)換部分
整數(shù)轉(zhuǎn)換部分主要是'%d',?'%i',?'%o',?'%u',?'%x',?和?'%X'這幾個參數(shù)命令的,由于參數(shù)的不同,可以輸出 不同格式的結(jié)果。如上表所列:?'%d',?'%i'是輸出一個帶符號的十進(jìn)制的數(shù),'%o',?'%u',?and?'%x'是輸出一個不帶符號的數(shù), 而'%X是'%x''的大寫形式。其中,針對這幾種不同輸出選擇還有如下幾個參數(shù)項:
'-’?表示是左對齊,一般都是右對齊的。? '+’?是對'%d',?'%i'兩個參數(shù)而言的,是指以'+’符號表示正數(shù)? '?'?是對'%d',?'%i'兩個參數(shù)而言的,如果輸出不是以'+’'-’開頭的,那么用空格做開頭。? '#'?是對'%o'參數(shù)而言的,將在輸出的結(jié)果強(qiáng)制加上'0’為開頭。? '''?將輸出的數(shù)字以LC_NUMERIC的分類法用’,’隔開。? '0'?將空格的地方用'0'填入。? 如果沒有特別指明,被格式化的參數(shù)被默認(rèn)當(dāng)作整數(shù)處理,或者可以用以下的類型指定參數(shù)來進(jìn)行修改,如下:
'h'?指定傳入?yún)?shù)是?short?int?或unsigned?short?int類型的? 'l'?指定傳入?yún)?shù)是?long?int或unsigned?long?int類型的? 'q'?指定傳入?yún)?shù)是?long?long?int類型的? 'Z'?指定傳入?yún)?shù)是size_t.。? 為了方便理解給出一個例子:
對于如下的格式化匹配字串:? "|%5d|%-5d|%+5d|%+-5d|%?5d|%05d|%5.0d|%5.2d|%d|"
將產(chǎn)生類似如下的輸出:
|?0|0?|?+0|+0?|?0|00000|?|?00|0| |?1|1?|?+1|+1?|?1|00001|?1|?01|1| |?-1|-1?|?-1|-1?|?-1|-0001|?-1|?-01|-1| |100000|100000|+100000|?100000|100000|100000|100000|100000|
對于如下的格式化匹配字串:? "|%5u|%5o|%5x|%5X|%#5o|%#5x|%#5X|%#10.8x|"
將產(chǎn)生類似如下的輸出:
|?0|?0|?0|?0|?0|?0x0|?0X0|0x00000000| |?1|?1|?1|?1|?01|?0x1|?0X1|0x00000001| |100000|303240|186a0|186A0|0303240|0x186a0|0X186A0|0x000186a0|
3.2?浮點(diǎn)數(shù)的轉(zhuǎn)換部分
浮點(diǎn)數(shù)轉(zhuǎn)換部分主要是'%f',?'%e',?'%E',?'%g',?和?'%G'?'這幾個參數(shù)命令的,由于參數(shù)的不同,可以輸出不同格式的結(jié)果。如上表所列:?'%f'是輸出一個比較固定形式的浮點(diǎn)數(shù)……其中,針對這幾種不同輸出選擇還有如下幾個參數(shù)項:
'-’?表示是左對齊,一般都是右對齊的。? '+’?是指以'+’符號表示正數(shù)? '?'?如果輸出不是以'+’'-’開頭的,那么用空格做開頭? '#'?是對'%g'和'%G’參數(shù)而言的,將在輸出的結(jié)果強(qiáng)制加上'0’為開頭。? '''?將輸出的數(shù)字以LC_NUMERIC的分類法用’,’隔開。? '0'?將空格的地方用“0'填入。? 如果沒有特別指定,傳入的被格式化的參數(shù)默認(rèn)是double類型的,可以用'L’表示是一個long?double類型的。
如下例子可以看出浮點(diǎn)數(shù)格式化的字串:
如下的格式字串:
"|%12.4f|%12.4e|%12.4g|"
可能產(chǎn)生如下的輸出:
|?0.0000|?0.0000e+00|?0| |?1.0000|?1.0000e+00|?1| |?-1.0000|?-1.0000e+00|?-1| |?100.0000|?1.0000e+02|?100| |?1000.0000|?1.0000e+03|?1000| |?10000.0000|?1.0000e+04|?1e+04| |?12345.0000|?1.2345e+04|?1.234e+04| |?100000.0000|?1.0000e+05|?1e+05| |?123456.0000|?1.2346e+05|?1.234e+05|
3.3?其他格式的轉(zhuǎn)換部分
這部分的函數(shù)比較簡單一些,具體如下:
'%c’是指輸出一個單個的字符串,默認(rèn)的輸出的被格式化的參數(shù)是unsigned?char類型的,可以用'-’表示左對齊的。沒有的別的參數(shù),比如:? printf?("%c%c%c%c%c",?'h',?'e',?'l',?'l',?'o');
顯示結(jié)果為:?'hello'
'%s’是輸出一個字串,.?默認(rèn)的輸出的被格式化的參數(shù)是char?*?(or?const?char?*).?類型的,可以用'-’表示左對齊的。沒有的別的參數(shù),比如:? printf?("%3s%-6s",?"no",?"where");
顯示結(jié)果:?'?nowhere?'.
注:?如果你用這個參數(shù)來格式化輸出一個指針類型的參數(shù)時,有可能會得到一個'(null)'的輸出值。不過有時候用于指針為空的緣故程序運(yùn)行時會產(chǎn)生“Segmentation?fault”的錯誤,下面一個例子就會產(chǎn)生這樣的錯誤:
#include
main()
{
char?a;
a?=?inet_addr("192.168.1.1");
if(a!=-1){
printf("ip:%s",a);/*?這里的%s可能會產(chǎn)生錯誤,應(yīng)改用用%p比較好一些*/
}
}
'%m’是輸出error信息的。如下例子:? fprintf?(stderr,?"can't?open?'%s':?%m",?filename);
等于如下的輸出命令:
fprintf?(stderr,?"can't?open?'%s':?%s",?filename,?strerror?(errno));
“%p”是輸出指針類型參數(shù)的,顯然被格式化的輸入蠶室必須是指針,可以用“-”來表示左對齊的。? “%n”是比較特殊的參數(shù),它不對格式化輸出影響,而是得到輸出結(jié)果的字符長度,可以用類型指定參數(shù)'h'?和?'l'來分別指定輸出的參數(shù)分別是short?int?*和?long?int?*類型的。如下面的例子: int?nchar; printf?("%d?%s%n",?3,?"bears",?&nchar);
輸出結(jié)果:
3?bears
同時將7的值賦給變量nchar。
'%%'是輸出“%”的字符。
?HopeCao 回復(fù)于:2003-02-28 13:19:11
<三>;
4.函數(shù)具體介紹
4.1printf()函數(shù)
printf()函數(shù)是格式化輸出函數(shù)系列中比較有具有普遍特點(diǎn)的,?一般用于向標(biāo)準(zhǔn)輸出設(shè)備按規(guī)定格式輸出信息。在編寫程序時經(jīng)常會用到此函數(shù)。printf()函數(shù)的調(diào)用格式為:
printf("<格式化字符串>;",?<參量表>;);
#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);?/*結(jié)果輸出十進(jìn)制整數(shù)a=1234*/
printf("a=%6d",?a);?/*結(jié)果輸出6位十進(jìn)制數(shù)a=?1234*/
printf("a=%06d",?a);?/*結(jié)果輸出6位十進(jìn)制數(shù)a=001234*/
printf("a=%2d",?a);?/*a超過2位,?按實(shí)際值輸出a=1234*/
printf("*i=%4d",?*i);?/*輸出4位十進(jìn)制整數(shù)*i=?12*/
printf("*i=%-4d",?*i);?/*輸出左對齊4位十進(jìn)制整數(shù)*i=12*/
printf("i=%p",?i);?/*輸出地址i=06E4*/
printf("f=%f",?f);?/*輸出浮點(diǎn)數(shù)f=3.141593*/
printf("f=6.4f",?f);?/*輸出6位其中小數(shù)點(diǎn)后4位的浮點(diǎn)數(shù)f=3.1416*/
printf("x=%lf",?x);?/*輸出長浮點(diǎn)數(shù)x=0.123457*/
printf("x=%18.16lf",?x);/*輸出18位其中小數(shù)點(diǎn)后16位的長浮點(diǎn)數(shù)x=0.1234567898765432*/
printf("c=%c",?c);?/*輸出字符c=A*/
printf("c=%x",?c);?/*輸出字符的ASCII碼值c=41*/
printf("s[]=%s",?s);?/*輸出數(shù)組字符串s[]=Hello,?Comrade*/
printf("s[]=%6.9s",?s);/*輸出最多9個字符的字符串s[]=Hello,Co*/
printf("s=%p",?s);?/*輸出數(shù)組字符串首字符地址s=FFBE*/
printf("*p=%s",?p);?/*?輸出指針字符串p=How?do?you?do*/
printf("p=%p",?p);?/*輸出指針的值p=0194*/
getch();
retunr?0;
}
上面結(jié)果中的地址值在不同計算機(jī)上可能不同。
例子中第一條語句#include的含義是調(diào)用另一個文件stdio.h,?這是一個頭文件,?其中包括全部標(biāo)準(zhǔn)輸入輸出庫函數(shù)的數(shù)據(jù)類型定 義和函數(shù)說明。對每個庫函數(shù)便用的變量及函數(shù)類型都已作了定義與說明,?放在相應(yīng)頭文件"*.h"中,?用戶用到這些函數(shù)時必須要用 #include<*.h>;或#include"*.h"?語句調(diào)用相應(yīng)的頭文件,?以供若沒有用此語句說明,?則連接時將會出現(xiàn)錯誤。
4.2?fprintf()函數(shù)
fprintf(?)?函數(shù)中格式化的規(guī)定與printf(?)?函數(shù)相同,?所不同的只是fprintf()函數(shù)是向文件中寫入。而printf()是向屏幕輸出。
下面介紹一個例子,?運(yùn)行后產(chǎn)后一個test.dat的文件。
#include
main()
{
char?*s="That's?good?news"};?/*定義字符串指針并初始化*/
int?i=617;?/*定義整型變量并初始化*/
FILE?*fp;?/*定義文件指針*/
fp=fopne("test.dat",?"w");?/*建立一個文字文件只寫*/
fputs("Your?score?of?TOEFLis",?fp);/*向所建文件寫入一串字符*/
fputc(':',?fp);?/*向所建文件寫冒號:*/
fprintf(fp,?"%d",?i);?/*向所建文件寫一整型數(shù)*/
fprintf(fp,?"%s",?s);?/*向所建文件寫一字符串*/
fclose(fp);?/*關(guān)閉文件*/
}
用CAT命令顯示TEST.DAT的內(nèi)容如下所示:屏幕顯示
Your?score?of?TOEFL?is:?617 That's?good?news
4.3?sprintf()?函數(shù)
sprintf(string,?fmt,?...)傳回的是string的類型的數(shù)組,并以空字符結(jié)尾。不過,該函數(shù)有可能超過為字符分配的長度。比較危險。下面是一個sprintf()的事例。
int
//根據(jù)傳進(jìn)來的Mission數(shù)據(jù)結(jié)構(gòu),建立socket鏈接,取得文件的大小。
get_size_of_url(struct?Mission*?pms)
{
int?s;
struct?sockaddr_in?sin;
struct?hostent*?phe;
char?cmd[256];
char?msg_hdr[1000];
char*?p;
//準(zhǔn)備http中GET?方法的請求。
sprintf(cmd,"GET?%s?HTTP/1.0",?pms->;url);
//創(chuàng)建socket
if((s=socket(PF_INET,SOCK_STREAM,0))<0)
return?-1;
//取得遠(yuǎn)程主機(jī)的IP地址,失敗函數(shù)返回-1
if((phe?=?gethostbyname(pms->;host))?==?NULL)
return?-1;
memset(&sin,0,sizeof(sin));
memcpy(&sin.sin_addr,phe->;h_addr,sizeof(struct?in_addr));
sin.sin_family=AF_INET;
sin.sin_port=htons(pms->;port);
//跟遠(yuǎn)程機(jī)器建立連接,失敗函數(shù)返回-1
if(connect(s,(struct?sockaddr*)&sin,sizeof(sin))==-1)
return?-1;
//發(fā)送GET請求
if(write(s,cmd,strlen(cmd))<0)
return?0;
//從鏈接描述符(連接管道)中讀取傳送過來的數(shù)據(jù)
if(read(s,?msg_hdr,?300)<0)
return?0;
close(s);
printf("%s",msg_hdr);
//讀到該文件的大小
if((p=strstr(msg_hdr,"Content-Length"))||(p=strstr(msg_hdr,"Content-length:")))
p+=16;
else
return?0;
//返回大小
return?atoi(p);
}
注:在大部份的Unix系統(tǒng)上,sprintf(string,?fmt,?...)傳回的是string的指標(biāo),然而,這方面Linux(遵循ANSI)傳回的卻是放入string內(nèi)的字元數(shù)目.進(jìn)行移植時,尤其是針對SunOS,需有警覺的心。
4.4?Snprintf()函數(shù)
Snprintf()函數(shù)與Sprintf()函數(shù)極為相似,但是該函數(shù)多了size參數(shù)來表示最大的字符數(shù)目,該函數(shù)返回一個整數(shù)值表示被存儲的字符的數(shù)目,如果返回-1則表示輸出的字符空間不夠。如下例子:
char?*
make_message?(char?*name,?char?*value)
{
/*?預(yù)分配100個字符空間.?*/
int?size?=?100;
char?*buffer?=?(char?*)?xmalloc?(size);
while?(1)
{
/*?輸出格式化的字符到給定的空間中.?*/
int?nchars?=?snprintf?(buffer,?size,"value?of?%s?is?%s",name,?value);
/*?判斷是否返回真值?*/
if?(nchars?<?size)
return?buffer;
/*?如果空間不夠,加大預(yù)分配空間到2倍?*/
size?*=?2;
buffer?=?(char?*)?xrealloc?(size,?buffer);
}
}
4.5?asprintf()函數(shù)
int?asprintf?(char?**ptr,?const?char?*template,?...)
本函數(shù)跟sprintf()函數(shù)很類似,只是它將字符串的分配改成動態(tài)分配的形式,參數(shù)ptr是指一個char?*對象的地址函數(shù)返回指向一個新建的指針。如下例子:
/*?Construct?a?message?describing?the?value?of?a?variable?whose?name?is?name?and?whose?value?is?value.?*/
char?*
make_message?(char?*name,?char?*value)
{
char?*result;
asprintf?(&result,?"value?of?%s?is?%s",?name,?value);
return?result;
}
4.6?Vprintf()函數(shù)
int?vprintf?(const?char?*template,?va_list?ap)
本函數(shù)跟printf函數(shù)很類似,只是將參數(shù)的數(shù)目可變的,變成了一個指針的列表。
4.7?Vfprintf()函數(shù)
int?vfprintf?(FILE?*stream,?const?char?*template,?va_list?ap)
本函數(shù)跟fprintf函數(shù)很類似,只是將參數(shù)的數(shù)目可變的,變成了一個指針的列表。
4.8?vfprintf()函數(shù)
int?vsprintf?(char?*s,?const?char?*template,?va_list?ap)
本函數(shù)跟sprintf函數(shù)很類似,只是將參數(shù)的數(shù)目可變的,變成了一個指針的列表。
4.9?vsnprintf()函數(shù)
int?vsnprintf?(char?*s,?size_t?size,?const?char?*template,?va_list?ap)
本函數(shù)跟snprintf函數(shù)很類似,只是將參數(shù)的數(shù)目可變的,變成了一個指針的列表。
4.10?vasprintf()函數(shù)
int?vasprintf?(char?**ptr,?const?char?*template,?va_list?ap)
本函數(shù)跟asprintf函數(shù)很類似,只是將參數(shù)的數(shù)目可變的,變成了一個指針的列表。
|
|
總結(jié)
以上是生活随笔為你收集整理的关于printf输出 格式化规定符 的的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。