C語言格式化輸出


一、格式化輸出

格式化輸出的函數有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)
作者:碼農有道

如果文章有錯別字,或者內容有錯誤,或其他的建議和意見,請您留言指正,非常感謝!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM