c++中sprintf()函式應用
在將各種型別的資料構造成字串時,雖然現在c++的字串可以實現字元轉換(to_string)和連線("+"),但是利用sprintf ()的強大功能可以事辦功倍。sprintf在合理指定引數後,它能將你需要的內容一次性列印到指定的字串中,從而被大量應用。
1.函式原型
sprintf 是個變參函式,定義如下:
int sprintf( char *buffer, const char *format [, argument] ... );
除了前兩個引數型別固定外,後面可以接任意多個引數。第乙個引數,是乙個字元指標,通常需要指定buffer長度才能呼叫,不能直接應用字串來代替;第二個引數指定buffer的組成格式,它決定了buffer的組成樣式,也是使用者可以根據需要來確定的,此引數可以說是此函式的精華,給了使用者足夠的發揮空間;後續其他引數則是需要被格式化輸出的資料。
2
.函式使用
2.1 格式化數字字串
將數字格式化為字串,相當於
itoa
函式。使用例項:
//把整數123 列印成乙個字串儲存在s 中。
sprintf(s, "%d", 666); //產生"666"
//預設對齊方式為右對齊,在不足寬度時在左邊補空格;
//若要實現左對齊,在%號加-即可,即使用%-模式指定格式;
//預設右對齊,可以指定寬度,不足的左邊補空格:
sprintf(s, "%8d", 666); //產生:" 666",左邊補5個空格實現指定寬度對齊
//左對齊:
sprintf(s, "%-8d", 666); //產生:"666 ",實現左對齊
2.2 控制浮點數列印格式
sprintf常用來格式化浮點數,浮點數使用格式符」%f」表示,預設保
留小數點後6位數字。使用例項:
sprintf(s, "%f", 3.1415926); //產生"3.141593",預設格式,會有四捨五入
//但有時我們希望自己控制列印的寬度和小數字數,這時就應該使用:」%m.nf」格式,其中m 表
示列印的寬度,n 表示小數點後的位數;在同時指定寬度
m和小數點後位數n時,優先滿足
n,即n優先級別更高。
sprintf(s, "%10.3f", 3.1415626); //產生:" 3.142"
sprintf(s, "%.3f", 3.1415626); //不指定總寬度,產生:"3.142"
2.3 連線字串
sprintf 的格式控制串中可以插入各種東西,並最終把它們「連成一串」,自然也就能夠連線字串,從而在許多場合可以替代strcat,但sprintf相較於strcat功能更為強大,因其能夠一次連線多個字串(自然也可以同時在它們中間插入別的內容,非常靈活)。例項:
char* who = "i";
char* whom = "csdn";
sprintf(s, "%s love %s.", who, whom); //產生:"i love csdn. "
strcat 只能連線字串,但對於字元陣列或者字元流,它就無法實現串連。如果直接連線,不管是sprintf 還是strcat 肯定會導致非法記憶體操作。要想實現連線,可以應用2.2介紹的列印整數和浮點數時可以指定寬度的方法。比如:
char a1 = ;
char a2 = ;
//不能應用如下連線方式:
sprintf(s, "%s%s", a1, a2);
或者:
sprintf(s, "%7s%7s", a1, a2);
//正確的連線方式應該是:
sprintf(s, "%.7s%.7s", a1, a2);//產生:"abcdefghijklmn"這可以
模擬列印浮點數的」%m.nf」,在」%m.ns」中,m 表示占用寬度(字串長度不足時補空格,超出了則按照實際寬度列印),n 才表示從相應的字串中最多取用的字元數。自然,也可以前後都只取部分字元,如:
sprintf(s, "%.6s%.5s", a1, a2);//產生:"abcdefhijkl"
2.4 動態長度指定
在許多時候,
我們或許還希望這些格式控制符中用以指定長度資訊的數字是動態的,而不是靜態指定的,因為許多時候,程式要到執行時才會清楚到底需要取字元陣列中的幾個字元,這種動態的寬度/精度設定功能在sprintf 的實現中也被考慮到了。sprintf 採用
」*」來占用乙個本來需要乙個指定寬度或精度的常數數字的位置,同樣,實際的寬度或精度就可以和其它被列印的變數一樣被提供出來,應用動態長度指定方式對於上述介紹的各列印方式,它們可以用如下方法實現:
//列印字元陣列或者字元流
sprintf(s, "%.*s%.*s", 7, a1, 7, a2);
或者:sprintf(s, "%.*s%.*s", sizeof(a1), a1, sizeof(a2), a2); //
列印字元、整數、浮點數等都可以動態指定那些常量值
sprintf(s, "%-*d", 4, 'a'); //產生"65 "
sprintf(s, "%#0*x", 8, 128); //產生"0x000080","#"產生0x
sprintf(s, "%*.*f", 10, 2, 3.1415926); //產生" 3.14"
3.函式使用注意事項
sprintf 是個變參函式,使用時經常出問題,而且只要出問題通常就是能導致程式崩潰的記憶體訪
問錯誤。對於其常見的幾種出錯,提出以下幾點注意事項。
a 前面兩個引數是必須引數,確保輸入無誤;
b 第乙個引數的長度一定要足夠,保證寫入時不至於出現溢位;
c 第二個引數和後面變參的格式一定要對應,整數對應%d等,不要隨意對應。
C語言sprintf 函式
int sprintf char str,const char format,傳送格式化輸出到str所指向的字串。下面是 sprintf 函式的宣告。int sprintf char str,const char format,如果成功,則返回寫入的字元總數,不包括字串追加在字串末尾的空字元。如果失...
C 中sprintf 函式的使用詳解
在將各種型別的資料構造成字串時,sprintf 的強大功能很少會讓你失望。由於sprintf 跟printf 在用法上幾乎一樣,只是列印的目的地不同而已,前者列印到字串中,後者則直接在命令列上輸出。這也導致sprintf 比printf 有用得多。sprintf 是個變參函式,定義如下 int sp...
ctf知識 C庫中的sprintf 函式
c 庫函式int sprintf char str,const char format,傳送格式化輸出到str所指向的字串。下面是 sprintf 函式的宣告。int sprintf char str,const char format,specifier 說明符 輸出c 字元d 或 i 有符號十進...