windows下的_snprintf
声明格式:
int _snprintf(char *buffer, size_t count, const char *format [,argument ] ...);
假设:源字符串长度len ,目的串为str ,count为要拷贝的字符个数
如果len < count ,则将源串拷贝到目的串str中,后面再加个空字符 ,返回值为源串长度len,
len = count ,将源串拷贝到目的串str中,后面不自动加空字符,返回值是源串长度len
len > count 截取源串count长度的子串拷贝到目的串str中,后面不自动加空字符,返回值是 -1 .
综上,为了更安全的使用_snprintf,我们人为的加上空字符,
正确示例为:
int main() { char str[10]; //表示最后一位留给空字符 const char *s = "hello"; //如果源串较长,大于目的穿,拷贝字符串长度设置为sizeof(str)-1, int ret = _snprintf(str, sizeof(str)-1, "test:%s", s); //在尾部加上空字符 str[sizeof(str)-1] = 0; cout << "sizeof(str) = " << sizeof(str) << endl; //strlen()查找字符个数,遇到空字符 ‘ ’停止 cout << "strlen(str) = " << strlen(str)<<endl; cout << "return value = " << ret << endl; cout << endl; cout <<"str[]的内容: "; for (int i = 0;i < 10;i++) { cout << str[i]; } cout <<endl; cout << endl; }
输出:
空字符不算作长度,拷贝指定长度的字符串
总结:无论源串长度时都大于目的串,我们总是人为的在尾部加上空字符就好了。
保持这样的写法:
int ret = _snprintf(str, sizeof(str)-1, "test:%s", s); str[sizeof(str)-1] = 0;
附:Linux下是snprintf
函数名不一样,自己写一个snprintf,调用_snprintf,然后再VC++编译的时候启用
为了跨平台,重新定义一个snprintf,就可以接着使用 _snprintf,不过还没有试验。。。
#ifdef __GNUC__
#define _snprintf snprintf
#endif