一、格式化輸出
格式化輸出的函數有printf、sprintf和snprintf等,功能略有不同,使用方法大同小異,本章節我們先以printf為例。
對於 printf 函數,相信大家並不陌生。之所以稱它為格式化輸出函數,該函數的聲名如下:
int printf(const char *format, ...)
大家看到printf函數的聲明就會有點懵,它參數的寫法與我們之前學到的函數知識不一樣,printf函數是一個“可變參數函數”(即函數參數的個數是可變的),可變參數函數的知識以后再介紹,現在只要知道怎么使用就行了。
printf函數的參數的個數和類型都是可變的,每一個參數的輸出格式都有對應的格式說明符與之對應,從格式串的左端第1 個格式說明符對應第 1 個輸出參數,第 2 個格式說明符對應第 2 個輸出參數,第 3個格式說明符對應第 3 個輸出參數,以此類推。
其中,格式說明符的形式如下(方括號 [] 中的項為可選項):
%[flags][width][.prec] type
1、類型符(type)
它用以表示輸出數據的類型,以下是常用類型的匯總,不常用的就不列了。
%hd、%d、%ld 以十進制、有符號的形式輸出 short、int、long 類型的整數。
%hu、%u、%lu 以十進制、無符號的形式輸出 short、int、long 類型的整數
%c 輸出字符。
%lf 以普通方式輸出double(float棄用,long doube無用)。
%e 以科學計數法輸出double。
%s 輸出字符串。
以上輸出數據的知識在之前介紹數據類型的時候已演示過,這里就不舉例了。
2、寬度(width)
它用於控制輸出內容的寬度。
printf("=%12s=\n","abc"); // 輸出= abc=
printf("=%12d=\n",123); // 輸出= 123=
printf("=%12lf=\n",123.5); // 輸出= 123.500000=
3、對齊標志(flags)
flags它用於控制輸出內容的對齊方式。
不填或+:輸出的內容右對齊,這是缺省的方式,上一小節就是右對齊的示例。
-:輸出的內容左對齊。
printf("=%-12s=\n","abc"); // 輸出=abc =
printf("=%-12d=\n",123); // 輸出=123 =
printf("=%-12f=\n",123.5); // 輸出=123.500000 =
如果輸出的內容是整數或浮點數,並且對齊的方式是右對齊,可以加0填充,例如:
printf("=%012s=\n","abc"); // 輸出= abc=
printf("=%012d=\n",123); // 輸出=000000000123=
printf("=%012f=\n",123.5); // 輸出=00123.500000=
從上面第一行代碼的結果看出,輸出的內容不是整數或浮點數,是字符串,不能在前面填0。
左對齊的時候,能在整數或浮點數的后面補0嗎?浮點數最多可以補到6位,整數不行,為什么?您的存款能在后面補0嗎?
4、精度(prec)
如果輸出的內容是浮點數,它用於控制輸出內容的精度,也就是說小數點后面保留多少位,后面的數四舍五入。
printf("=%12.2lf=\n",123.5); // 輸出= 123.50=
printf("=%.2lf=\n",123.5); // 輸出=123.50=
printf("=%12.2e=\n",123500000000.0); // 輸出= 1.24e+11=
printf("=%.2e=\n",123500000000.0); // 輸出=1.24e+11=
二、格式化輸出到字符串
int printf(const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
功能:printf是把結果輸出到屏幕,sprintf把格式化輸出的內容保存到字符串str中,snprintf的n類似於strncpy中的n,意思是只獲取輸出結果的前n-1個字符,不是n個字符。
在之前的章節中,介紹過把字符串轉換為整數和浮點數據的庫函數,C語言沒有提供把整數和浮點數據轉換為字符串的庫函數,而是采用sprintf和snprintf函數格式化輸出到字符串。
示例(book98.c)
/*
* 程序名:book98.c,此程序演示格式化輸出sprintf和snprintf函數。
* 作者:C語言技術網(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <string.h>
int main()
{
char str[301];
// 格式化輸出到str中
sprintf(str,"%d,%c,%f,%s",10,'A',25.97,"一共輸入了三個數。");
printf("%s\n",str);
// 格式化輸出到str中,只截取前7個字符
snprintf(str,8,"%d,%c,%f,%s",10,'A',25.97,"一共輸入了三個數。");
printf("%s\n",str);
}
運行結果
程序運行第二行只輸出了6個字符,注意,snprintf函數在unix和windows平台下的表現略有不同,在windows平台下,第二行會輸出7個字符。
三、C語言代碼的多行書寫
在我們之前學習的過程中,編寫的程序的功能很簡單,一句代碼很短,但是在實際開發中,參數往往很長很多,一句代碼可能會很長,需要用多行才能書寫。
如果我們在一行代碼的行尾放置一個反斜杠,c語言編譯器會忽略行尾的換行符,而把下一行的內容也算作是本行的內容。這里反斜杠起到了續行的作用。
strcpy(str,"aaaaaaaaaa\
bbbbbbbbb);
如果我們不使用反斜杠,當我們試圖初始化一個跨多行的字符串時,c語言編譯器可能會發出警告或錯誤,如下面的語句是不正確的。
strcpy(str,"aaaaaaaaaa
bbbbbbbbb);
C語言中還有字符串多行書寫的方法,那就是將它寫個多個字符串,C語言編譯器會自動將這些字符串連接起來,如下:
strcpy(str,"aaabbbccc");
printf("str=%s=\n",str); // 輸出str=aaabbbccc=
strcpy(str,"aaa""bbb""ccc");
printf("str=%s=\n",str); // 輸出str=aaabbbccc=
strcpy(str,"aaa"\
"bbb"\
"ccc");
printf("str=%s=\n",str); // 輸出str=aaabbbccc=
sprintf(str,"aaabbbccc");
printf("str=%s=\n",str); // 輸出str=aaabbbccc=
sprintf(str,"aaa""bbb""ccc");
printf("str=%s=\n",str); // 輸出str=aaabbbccc=
sprintf(str,"aaa"\
"bbb"\
"ccc");
printf("str=%s=\n",str); // 輸出str=aaabbbccc=
以上每段代碼的輸出結果完全一樣,表達式:"aaa" "bbb" "ccc" 實際上相當於"aaabbbccc"。
把字符串很長,參數很多的代碼用多行書寫,可以使程序代碼結構更清晰,以下代碼是我實際開發中用到的一句代碼,這還不算長的。
四、課后作業
1)編寫示例程序,把本章節介紹的知識點全部演示一遍,用程序演示可以加深您的理解和映象。
2)編寫一個解析XML字符串的函數。
函數聲明:
int GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,char *out_Value);
in_XMLBuffer,XML格式的字符串,如下:
<name>西施</name><age>18</age><sc>火辣</sc><yz>漂亮</yz>
in_FieldName,字段的標簽名。
out_Value,獲取內容存放的變量的指針。
返回值,0-成功,-1-失敗。
調用示例:
char strXMLBuffer[1024];
strcpy(strXMLBuffer," <name>西施</name><age>18</age><sc>火辣</sc><yz>漂亮</yz>");
char strvalue[51];
GetXMLBuffer(strXMLBuffer,"name",strvalue); // strvalue的內容將是"西施"
GetXMLBuffer(strXMLBuffer,"age",strvalue); // strvalue的內容將是"18"
GetXMLBuffer(strXMLBuffer,"sc",strvalue); // strvalue的內容將是"火辣"
GetXMLBuffer(strXMLBuffer,"yz",strvalue); // strvalue的內容將是"漂亮"
五、版權聲明
C語言技術網原創文章,轉載請說明文章的來源、作者和原文的鏈接。
來源:C語言技術網(www.freecplus.net)
作者:碼農有道
如果文章有錯別字,或者內容有錯誤,或其他的建議和意見,請您留言指正,非常感謝!!!