在下面的代码例子中,name
可能来自用户输入,文件系统或者网络。程序从字符串构造文件名,为打开文件做准备
#include <stdio.h>
void func(const char *name) {
char filename[128];
sprintf(filename, "%s.txt", name);
}
因为sprinf
函数不保证输入字符串的长度,一个超长的字符串可能会导致一个内存溢出。
格式化字符串%s
可以指定精度,该精度表示格式化字符串最大的长度,例如:%123s
保证名字中最多有123个字符。这样就保证了filename不会内存溢出。
#include <stdio.h>
void func(const char *name) {
char filename[128];
sprintf(filename, "%.123s.txt", name);
}
当然,最好的方式是用snprinf函数替代sprintf函数
#include <stdio.h>
void func(const char *name) {
char filename[128];
snprintf(filename, sizeof(filename), "%s.txt", name);
}
注意: snprintf中的size选项大小包含字符串末尾的'\0'
,所以可以直接用sizeof来计算大小。
printf中的%123s
不包含字符串结束符'\0'
,所以要比实际小一个字符。
代码来自:卡耐基梅隆大学软件研究学院