大概知道sprintf的用法,今天在CSDN上看到一篇關於sprintf比較好的總結,現在抄下來,emmmmmmm.......
srpintf()函數的功能非常強大:效率比一些字符串操作函數要高;而且更具靈活性;可以將想要的結果輸出到指定的字符串中,也可作為緩沖區,而printf只能輸出到命令行上~
頭文件:stdio.h
函數功能:格式化字符串,將格式化的數據寫入字符串中。
函數原型:int sprintf(char *buffer, const char *format, [argument]...)
參數:
(1)buffer:是char類型的指針,指向寫入的字符串指針;
(2)format:格式化字符串,即在程序中想要的格式;
(3)argument:可選參數,可以為任意類型的數據;
函數返回值:buffer指向的字符串的長度;
用處:
(1)格式化數字字符串:
在這點上sprintf和printf的用法一樣,只是打印到的位置不同而已,前者打印給buffer字符串,后者打印給標准輸出,所以sprintf也可以用來將整型轉化為字符串,比itoa效率高且如此地簡便~比如:sprintf(buffer, "%d", 123456);執行后buffer即指向字符串“123456”~
(2)連接字符:
下面通過兩個例子來說明這個問題:
(a)連接以'\0'結束的字符串:
1 #include<stdio.h> 2 int main() 3 { 4 char buffer[10]; 5 char *a = "1234"; 6 char *b = "5678"; 7 sprintf(buffer, "%s%s", a, b); 8 printf("%s\n", buffer); 9 return 0; 10 }
運行結果:
(b)連接結尾沒有'\0'的字符數組或字符串緩沖區:
#include<stdio.h> int main() { char a[] = {'1', '2', '3', '4'}; char b[] = {'5', '6', '7', '8'}; char buffer[10]; sprintf(buffer, "%.4s%.4s", a, b); printf("%s\n", buffer); return 0; }
運行結果:
如果第二種情況的程序中,sprintf的format部分為"%4s%4s"或"%s%s",運行結果均為:
(c)如果我們想動態獲取要處理的字符緩沖區長度,則將上面sprintf改為:sprintf(buffer, "%.*s%.*s", sizeof(a), a, sizeof(b), b);即可~
(3)利用sprintf中的返回值:
在”AOV網絡和拓撲(二)——實現“篇中,有這樣一行程序:pos += sprintf(output+pos, "%d ", j+1); 它的作用是什么呢?
因為sprintf函數的返回值為output+pos所指向字符串的長度,所以對於pos來說,相當於執行了一次pos+=sizeof(output+pos),如果這條語句放在一個循環里,則第二次執行sprintf時output+pos隨即指向了當前緩沖區的末尾(注意不是output的末尾!否則會讀取非法內存!),這樣就可以生成一個具有一定規則的字符串了~寫個例子:
#include<stdio.h> int main() { char buf[100]; int pos = 0; for(int j = 0; j < 10; j++) pos += sprintf(buf+pos, "%d-", j); buf[pos-1] = '\n';//將最后一個字符'-'轉換為'\n' printf(buf); return 0; }
運行結果:
pos每次增加2,因為每次buf字符串后面都要加上兩個字符j和‘-’。
轉載自 nopoppy 的博客 地址:https://blog.csdn.net/nopoppy/article/details/52589745