printf和sprintf的區(qū)別

一、printf和sprintf的區(qū)別
sprintf函數(shù)打印到字符串中察滑,而printf函數(shù)打印輸出到屏幕上晃洒。sprintf函數(shù)在我們完成其他數(shù)據(jù)類型轉換成字符串類型的操作中應用廣泛人灼。


二坐昙、sprintf的使用詳解
1、該函數(shù)包含在stdio.h的頭文件中溉浙。
2烫止、sprintf函數(shù)的格式:
int sprintf( char *buffer, const char *format [, argument,...] );
除了前兩個參數(shù)固定外,可選參數(shù)可以是任意個戳稽。buffer是字符數(shù)組名馆蠕;format是格式化字符串(像:"%3d%6.2f%#x%o",%與#合用時期升,自動在十六進制數(shù)前面加上0x)。只要在printf中可以使用的格式化字符串互躬,在sprintf都可以使用播赁。其中的格式化字符串是此函數(shù)的精華。
3吼渡、sprintf函數(shù)打印到字符串中(可用于完成其他數(shù)據(jù)類型轉換成字符串和字符串拼接)容为。

例如:
3.1 將基本數(shù)據(jù)類型轉換成字符串
int i=10;
char str1[5];
sprintf(str1,"%d",i);
printf("str1=%s\n",str1);//str=10

3.2 可以控制精度
char str2[20];
double f=14.309948;
sprintf(str2,"%6.2f",f);
printf("str2=%s\n",str2);//str2=14.31

3.3 可以將多個基本數(shù)據(jù)類型拼接
char str[20];
int a=20984,b=48090;
sprintf(str,"%3d%6d",a,b);//str[]="20984 48090"
sprintf(str,"%3d%5d",a,b);//str[]="2098448090"
注意:最小輸出寬度:
(1)用十進制整數(shù)來表示輸出的最少位數(shù)寺酪。(至多要輸出這么多位?脖场)
(2)若實踐位數(shù)多于界說的寬度:則按實踐位數(shù)輸出。
(3)若實踐位數(shù)少于界說的寬度:a.則右對齊寄雀,左邊留空得滤。
b.有負號,左對齊盒犹,右邊留空
c.表示寬度的數(shù)字以0開端懂更,則右對齊,左邊留空急膀。
3.4 基本數(shù)據(jù)類型和字符串拼接在一塊
int a=500;
char str1[]="世界";
char str2[]="強";
char str[20];
sprintf(str,"%s%d%s\n",str1,a,str2);
printf("str=%s\n",str);//str=“世界500強”

3.5 字符串和字符串拼接在一塊
char str1[20];
memset(str1,0,20);//清空數(shù)據(jù)
//char s1[]={'A','B','C'};
//char s2[]={'D','E','F'};
char s1[5]="ABC";
char s2[5]="DEF";
sprintf(str1,"%.3s%.3s",s1,s2);
printf("str1=%s",str1); //str1=ABCDEF
注意:
(1) %m.n在字符串的輸出中沮协,m表示寬度,字符串共占的列數(shù)脖阵;n表示實際的字符數(shù)皂股。
(2) %m.n在浮點數(shù)中墅茉,m也表示寬度命黔;n表示小數(shù)的位數(shù)

3.6 字符串拼接(可以將多個任意大小的字符串拼接在一起存放在另一個字符串中)
注意:strlen():計算字符串實際的占字節(jié)大小
sizeof():計算字符串實際的占字節(jié)數(shù)+空字節(jié)“\0”
例如:
char str1[]="世界";
int i1=sizeof(str1);
printf("i1=%d\n",i1);//i1=5(兩個漢字占四個字節(jié)+一個空字節(jié))
int i2=strlen(str1);
printf("i2=%d\n",i2);i2=4(兩個漢字占四個字節(jié))

實例:
char str1[]="世界你好";
char str2[]="hello world";
char str3[]="上海歡迎您";

     int len=strlen(str1)+strlen(str2)+strlen(str3)+1;
     int lens=sizeof(str1)+sizeof(str2)+sizeof(str3)-2;    
      printf("len=%d lens=%d\n",len,lens);//30

    char *str=(char*)malloc(len);//開辟一塊空間
    sprintf(str,"%s%s%s\n",str1,str2,str3);
    注意:開辟一塊空間后并賦值后,length()是指針指向的內容占得字節(jié)數(shù)就斤; sizeof()是這個空間指所占得的字節(jié)數(shù)(一個指針占4個字節(jié))
    int leng=sizeof(str);
    int leng1=strlen(str);
    printf("%d %d %s\n",leng,leng1,str);//4 30 世界你好hello world"上海歡迎您
    
    free(str);//只是清空了str指向地址的內容悍募,地址空間并沒有釋放,然后需要再        str=NULL洋机;地址空間才會釋放坠宴。

3.7、可以動態(tài)指定绷旗,需要截取的字符數(shù)
char str1[20];
//char s1[]={'A','B','C'};
//char s2[]={'D','E','F'};
char s1[]="ABC";
char s2[]="DEF";
sprintf(str1,"%.s%.s",2,s1,3,s2);//注意這里的2和3
printf("%s\n",str1);//ABDEF

  char str2[20];
  sprintf(str2,"%*.*f", 10, 2, 3.1415926);
  //10:最小輸出寬度(若實踐位數(shù)少于界說的寬度,則右對齊喜鼓,左邊留空);  2:保留小數(shù)點后兩位
  printf("%s\n",str2);//           3.14

3.8、可以打印出i的地址
int i=10;
char s[30];
sprintf(s, "%p", &i);
printf("%s",s);
上面的語句相當于
sprintf(s, "%0*x", 2 * sizeof(void *), &i);

3.9衔肢、sprintf的返回值是字符數(shù)組中字符的個數(shù)庄岖,即字符串的長度,不用在調用strlen(s)求字符串的長度角骤。
實例:
sprintf(szTemp,"MYSQL>>>連接數(shù)據(jù)庫失敗(%s)\n",mysql_error(&m_mysql));


三隅忿、printf的使用詳解
功能:printf()函數(shù)是式樣化輸出函數(shù),可以根據(jù)指定格式從標準輸出設備中輸出信息.
原型:int printf()( const char* format , [argument] ... );(調用時需要添加<stdio.h>頭文件
參數(shù):format:格式控制符,argument:可選參數(shù).
返回值:若成功則返回輸出的字符數(shù),輸出出錯則返回負值.
額外說明
格式化字符串包括兩部分內容:一部分是正常字符,這些字符將按原樣輸出;另一部分是格式化規(guī)定字符,以"%"開始,后跟一個或幾個規(guī)定字符,用來確定輸出內容格式.
參量表是需要輸出的一系列參數(shù),其個數(shù)必須與格式化字符串所說明的輸出參數(shù)個數(shù)一樣多,各參數(shù)之間用","分開,且順序一一對應,否則將會出現(xiàn)意想不到的錯誤.
注意:printf()函數(shù)從左往右讀取,然后將先讀取放到棧底,最后讀取的放在棧頂,處理時候是從棧頂開始的.所我們看見的結果是,從右邊開始處理的.


四、函數(shù)格式化字符串詳解:
格式樣化字符串的格式樣是:%[標志][輸出最小寬度][.精度][長度]式樣字符

1背桐、標志
  標志              意義
  -                   結果左對齊优烧,右邊填空格
  +                   輸出標記(正號或負號)
  空格                輸出值為正時輸出空格,為負時輸出負號
  #                   正在八進制和十六進制線顯現(xiàn)前導航O,Ox
假如你還不太理解链峭,沒關系畦娄!請瞧下面的例子就會了如指掌了:

2.輸出最小寬度:
          (1)用十進制整數(shù)來表示輸出的最少位數(shù)。(至多要輸出這么多位1滓恰)
           (2)若實踐位數(shù)多于界說的寬度:則按實踐位數(shù)輸出纷责。
           (3)若實踐位數(shù)少于界說的寬度:
                                            a.則右對齊,左邊留空撼短。
                                             b.有負號百揭,左對齊退腥,右邊留空
                                             c.表示寬度的數(shù)字以0開端,則右對齊,左邊留空狸臣。
  我們再來瞧一個例子:
  例2:
  #include<stdio.h>
  int main()
  {
      int a=3456;
      printf("a=%3d/n",a);     //若實踐位數(shù)多于界說的寬度:則按實踐位數(shù)輸出
      printf("a=%10d/n",a);    //若實踐位數(shù)少于界說的寬度:則右對齊,左邊留空
      printf("a=%-10d/n",a);   //若實踐位數(shù)少于界說的寬度:有負號照瘾,左對齊馅闽,右邊留空
      printf("a=%010d/n",a);   //若實踐位數(shù)少于界說的寬度:表示寬度的數(shù)字以0開端,則右對齊熙参,左邊留空
      printf("a=%-010d/n",a); //左對齊艳吠,0無意義。
      return 0;
   }
  運轉結果:
              a=3456
              a=       3456
              a=3456
              a=0000003456
              a=3456

3.精度:
精度式樣符以“.”開頭孽椰,后跟十進制整數(shù)昭娩。意義是:假如輸出數(shù)字,則表示小數(shù)的位數(shù)黍匾;若實踐位數(shù)大于所界說的精度數(shù)栏渺,則四舍五進。若不敷則補0锐涯;假如輸出的是字符磕诊,則表示輸出字符的個數(shù);若實踐位數(shù)大于所界說的精度數(shù)纹腌,則截走超出的部分霎终。
例3:
#include<stdio.h>
int main()
{
printf("%.3f/n",12.3456);
printf("%.9f/n",12.3456);
printf("%.3s/n","abcdefg");
printf("%.9s/n","abcdefg");
return 0;
}
運轉結果:
12.346 //四舍五進到小數(shù)點后三位
12.345600000 //不敷補0
abc
abcdefg
所以對例1中的printf("b=%lf",b)只需該為printf("b=%.2lf",b)就可以對結果進行2位小數(shù)的保存了!

4.長度:長度式樣符為h,l兩種升薯,h表示按短整型量輸出莱褒,l表示按長整型量輸出。

5.式樣字符:
式樣 意義
————————————————————————————
d: - 以十進制方式輸出帶標記整數(shù)(正數(shù)不輸出標記)覆劈;
u: - 以十進制方式輸出無標記整數(shù)保礼;
f: - 以小數(shù)方式輸出單沛励、雙精度實數(shù);
e: - 以質數(shù)方式輸出單炮障、雙精度實數(shù)目派;
g: - 以%f,%e中較短的輸出寬度輸出單胁赢、雙精度實數(shù)企蹭;
c: - 輸出單個字符;
s: - 輸出字符串智末。
————————————————————————————
注:l正在d,o,x,u,前谅摄,指的輸出精度為long型;正在e,f,g前系馆,指定輸出精度為double型

6來談些本義字符:
本義字符是C言語中表示字符的一種非凡方式送漠。一般使用本義字符表示ASCII字符集中不可打印的控制字符和特定功能的字符,如用于表示字符常量的單撇號( ')由蘑,用于表示字符串常量的雙撇號( ")和反斜杠( /)等闽寡。本義字符用反斜杠/后面跟一個字符或一個八進制或十六進制數(shù)表示。

本義字符 意義 ASCII值(十進制)
/a 響鈴(BEL) 007
/b 退格(BS) 008
/f 換頁(FF) 012
/n 換行(LF) 010
/r 回車(CR) 013
/t 程度制表(HT) 009
/v 筆挺制表(VT) 011
// 反斜杠 092
/? 問號字符 063
/' 單引號字符 039
/" 雙引號字符 034
/0 空字符(NULL) 000
/ddd 恣意字符 三位八進制
/xhh 恣意字符 二位十六進制

字符常量中使用單引號和反斜杠以及字符常量中使用雙引號和反斜杠時尼酿,都務必使用本義字符表示爷狈,即正在這些字符前加上反斜杠。

正在C步驟中使用本義字符/ddd或者/xhh可以方便靈便地表示恣意字符裳擎。/ddd為斜杠后面跟三位八進制數(shù)涎永,該三位八進制數(shù)的值即為對應的八進制ASCII值。/x后面跟兩位十六進制數(shù)鹿响,該兩位十六進制數(shù)為對應字符的十六進制ASCII值羡微。

使用本義字符時需求注重以下標題:
(1) 本義字符中只能使用小寫字母,每個本義字符只能瞧作一個字符抢野。
(2) /v 筆挺制表和/f 換頁符對屏幕沒有任何影響拷淘,但會影響打印機施行呼應作。
(3) 正在C步驟中指孤,使用不可打印字符時,一般用本義字符表示贬堵。

其他需求注重的一些標題:

1.假如用浮點數(shù)表示字符或整型量的輸特別式, 小數(shù)點后的數(shù)字代表最大寬度, 小數(shù)點前的數(shù)字代表最小寬度恃轩。
例如: %6.9s 表示顯現(xiàn)一個長度不小于6且不大于9的字符串。若大于9, 則第9個字符賣前的內容將被增除黎做。
2.使用printf函數(shù)時還要注重一個標題叉跛,那就是輸出表列中的求值順序。差別的編譯零碎不一定相反蒸殿,可以從左到右筷厘,也可從右到左鸣峭。Turbo C是按從右到左進行的。請瞧下面兩個例子:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末酥艳,一起剝皮案震驚了整個濱河市摊溶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌充石,老刑警劉巖莫换,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異骤铃,居然都是意外死亡拉岁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門惰爬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喊暖,“玉大人,你說我怎么就攤上這事撕瞧『遄模” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵风范,是天一觀的道長咨跌。 經常有香客問我,道長硼婿,這世上最難降的妖魔是什么锌半? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮寇漫,結果婚禮上刊殉,老公的妹妹穿的比我還像新娘。我一直安慰自己州胳,他們只是感情好记焊,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著栓撞,像睡著了一般遍膜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓤湘,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天瓢颅,我揣著相機與錄音,去河邊找鬼弛说。 笑死挽懦,一個胖子當著我的面吹牛,可吹牛的內容都是我干的木人。 我是一名探鬼主播信柿,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼冀偶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了渔嚷?” 一聲冷哼從身側響起进鸠,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎圃伶,沒想到半個月后堤如,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡窒朋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年搀罢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侥猩。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡榔至,死狀恐怖,靈堂內的尸體忽然破棺而出欺劳,到底是詐尸還是另有隱情唧取,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布划提,位于F島的核電站枫弟,受9級特大地震影響,放射性物質發(fā)生泄漏鹏往。R本人自食惡果不足惜淡诗,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伊履。 院中可真熱鬧韩容,春花似錦、人聲如沸唐瀑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哄辣。三九已至请梢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柔滔,已是汗流浹背溢陪。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留睛廊,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓杉编,卻偏偏與公主長得像超全,于是被迫代替她去往敵國和親咆霜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容