sprintf函數(shù)的用法
注意事項:
sprintf 會自動擴展,之前定義一個char id[10] = {0x47,0x17,0xF0}數(shù)組,然后打印到字符串時候。
總是多打印幾個FFFF.
4717fffffff0.
最后 將char 類型改為 unsigned char 就可以了。
sprintf函數(shù)的用法
1、該函數(shù)包含在stdio.h的頭文件中。
2、sprintf和平時我們常用的printf函數(shù)的功能很相似。sprintf函數(shù)打印到字符串中(要注意字符串的長度要足夠容納打印的內(nèi)容,否則會出現(xiàn)內(nèi)存溢出),而printf函數(shù)打印輸出到屏幕上。sprintf函數(shù)在我們完成其他數(shù)據(jù)類型轉(zhuǎn)換成字符串類型的操作中應(yīng)用廣泛。
3、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ù)的精華。
printf 和sprintf都使用格式化字符串來指定串的格式,在格式串內(nèi)部使用一些以”%”開頭的格式說明符來占據(jù)一個位置,在后邊的變參列表中提供相應(yīng)的變量,最終函數(shù)就會用相應(yīng)位置的變量來替代那個說明符,產(chǎn)生一個調(diào)用者想要的字符串。
4、可以控制精度
char str[20];
double f=14.309948;
sprintf(str,”%6.2f”,f);
5、可以將多個數(shù)值數(shù)據(jù)連接起來
char str[20];
int a=20984,b=48090;
sprintf(str,”%3d%6d”,a,b);
str[]=”20984 48090”
6、可以將多個字符串連接成字符串
char str[20];
char s1[5]={‘A’,’B’,’C’};
char s2[5]={‘T’,’Y’,’x’};
sprintf(str,”%.3s%.3s”,s1,s2);
%m.n在字符串的輸出中,m表示寬度,字符串共占的列數(shù);n表示實際的字符數(shù)。%m.n在浮點數(shù)中,m也表示寬度;n表示小數(shù)的位數(shù)。
7、可以動態(tài)指定,需要截取的字符數(shù)
char str[20];
char s1[5]={‘A’,’B’,’C’};
char s2[5]={‘T’,’Y’,’x’};
sprintf(str,”%.*s%.*s”,2,s1,3,s2);
sprintf(str, “%*.*f”, 10, 2, 3.1415926);
8、可以打印出i的地址
char str[20];
int i;
sprintf(str, “%p”, &i);
上面的語句相當(dāng)于
sprintf(str, “%0*x”, 2 * sizeof(void *), &i);
9、sprintf的返回值是字符數(shù)組中字符的個數(shù),即字符串的長度,不用在調(diào)用strlen(str)求字符串的長度。
10、使用字符指針指向的字符串來接收打印的內(nèi)容
例子:
int main()
{
int ddd=666;
char *buffer=NULL;
if((buffer = (char *)malloc(80*sizeof(char)))==NULL)
{
printf("malloc error\n");
}
sprintf(buffer, "The value of ddd = %d", ddd);//The value of ddd = 666
printf("%s\n",buffer);
free(buffer);
buffer=NULL;
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
指針剛開始定義的時候,并不指向所處,可以指向一個變量,然后可以用,如果要單純用這個指針,那么要給這個指針malloc分配一片內(nèi)存,加了malloc就要加stdlib.h
11、設(shè)想當(dāng)你從數(shù)據(jù)庫中取出一條記錄,然后希望把他們的各個字段按照某種規(guī)則連接成一個字符串時,就可以使用這種方法,從理論上講,他應(yīng)該比strcat 效率高,因為strcat 每次調(diào)用都需要先找到最后的那個字符串結(jié)束字符’\0的位置,而在上面給出的例子中,我們每次都利用sprintf 返回值把這個位置直接記下來了。
例子:
void main(void)
{
char buffer[200], s[] = "computer", c = 'l';
int i = 35, j;
float fp = 1.7320534f; //
j = sprintf( buffer, " String: %s\n", s ); //
j += sprintf( buffer + j, " Character: %c\n", c ); //
j += sprintf( buffer + j, " Integer: %d\n", i ); //
j += sprintf( buffer + j, " Real: %f\n", fp );//
printf( "Output:\n%s\ncharacter count = %d\n", buffer, j );
}
1
2
3
4
5
6
7
8
9
10
11
該例子是將所有定義的數(shù)據(jù)和格式控制塊中的字符連接在一起,最后打印出來buffer的內(nèi)容和字符串中字符的個數(shù)。
結(jié)果如圖所示:
12、 格式化數(shù)字字符串
sprintf最常見的應(yīng)用之一莫過于把整數(shù)打印到字符串中。如:
(1)把整數(shù)123打印成一個字符串保存在s中。
sprintf(s, “%d”, 123); //產(chǎn)生“123″
(2)可以指定寬度,不足的左邊補空格:
sprintf(s, “%8d%8d”, 123, 4567); //產(chǎn)生:“ 123 4567″
當(dāng)然也可以左對齊:
sprintf(s, “%-8d%8d”, 123, 4567); //產(chǎn)生:“123 4567″
(3)也可以按照16進制打印:
sprintf(s, “%8x”, 4567); //小寫16進制,寬度占8個位置,右對齊
sprintf(s, “%-8X”, 4568); //大寫16進制,寬度占8個位置,左對齊
這樣,一個整數(shù)的16進制字符串就很容易得到,但我們在打印16進制內(nèi)容時,通常想要一種左邊補0的等寬格式,那該怎么做呢?很簡單,在表示寬度的數(shù)字前面加個0就可以了。
sprintf(s, “%08X”, 4567); //產(chǎn)生:“000011D7″
上面以”%d”進行的10進制打印同樣也可以使用這種左邊補0的方式。
這里要注意一個符號擴展的問題:比如,假如我們想打印短整數(shù)
(4)(short)-1的內(nèi)存16進制表示形式,在Win32平臺上,一個 short型占2個字節(jié),所以我們自然希望用4個16進制數(shù)字來打印它:
short si = -1;
sprintf(s, “%04X”, si);
產(chǎn)生“FFFFFFFF,怎么回事?因為 sprintf是個變參函數(shù),除了前面兩個參數(shù)之外,后面的參數(shù)都不是類型安全的,函數(shù)更沒有辦法僅僅通過一個“%X”就能得知當(dāng)初函數(shù)調(diào)用前參數(shù)壓棧時 被壓進來的到底是個4字節(jié)的整數(shù)還是個2字節(jié)的短整數(shù),所以采取了統(tǒng)一4字節(jié)的處理方式,導(dǎo)致參數(shù)壓棧時做了符號擴展,擴展成了32位的整數(shù)-1,打印時 4個位置不夠了,就把32位整數(shù)-1的8位16進制都打印出來了。如果你想看si的本來面目,那么就應(yīng)該讓編譯器做0擴展而不是符號擴展(擴展時二進制左邊補0而不是補符號位):
sprintf(s, “%04X”, (unsigned short)si);
就可以了?;蛘撸?/p>
unsigned short si = -1;
sprintf(s, “%04X”, si);
sprintf和printf還可以按8進制打印整數(shù)字符串,使用”%o”。注意8進制和16進制都不會打印出負數(shù),都是無符號的,實際上也就是變量的內(nèi)部編碼的直接用16進制或8進制表示。
參考:http://blog.csdn.net/cos_sin_tan/article/details/7548632
http://nnssll.blog.51cto.com/902724/198237/
http://blog.csdn.net/s202090414/article/details/8690518
http://blog.csdn.net/peng___peng/article/details/51510685
————————————————
原文鏈接:https://blog.csdn.net/yishizuofei/article/details/78195255
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。