sprintf最常用的功能莫過(guò)于將int,float等類(lèi)型數(shù)據(jù)打印到char數(shù)組中去椰于。但是使用sprintf常常會(huì)由于疏忽產(chǎn)生緩沖區(qū)溢出的問(wèn)題,導(dǎo)致不可知的錯(cuò)誤廉羔。
snprintf是sprintf的安全版本,其函數(shù)原型為
int _snprintf(char *buffer, size_t count, const char *format [,argument] ... );
其第二個(gè)參數(shù)可以指定轉(zhuǎn)換后字符串在緩沖區(qū)中的長(zhǎng)度孩饼,確保不發(fā)生溢出竹挡。
當(dāng)然,有一個(gè)問(wèn)題需要注意梯码,指定的轉(zhuǎn)換長(zhǎng)度是包含結(jié)束符"\0"的字節(jié)數(shù)好啰,例如,
float a = 1.23;
char buf[10];
snprintf(buf,4,"%f",a);
cout << buf;
得到1.2鳄抒,而要完整的轉(zhuǎn)換a,則需要指定轉(zhuǎn)換長(zhǎng)度為5,
float a = 1.23;
char buf[10];
snprintf(buf,5,"%f",a);
cout << buf;