一、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是按從右到左進行的。請瞧下面兩個例子: