这几天在用Thrift 传输一个文件时,发现此问题,特mark;
char字符串给string赋值,都是用 string str = string(charBuf),但如果charBuf 含有空字符,那么赋值后字符串会被0截断,查了下string 的构造函数
string(const char * s)
说明:将string对象初始化为s指向NBTS。NBTS为null-byte-temnated string的缩写,表示以空字符结束的字符串------ 传统的C字符串
原来是用错了string 构造函数,查了下用string的赋值函数assign可以实现含空字符字符串赋值,其中string &assign(const char *s) 这种赋值方式,也将s当作C字符串,也是会被'\0'截断,要用带字符个数才可以。具体见如下测试代码:
===================================
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
int main()
{
char buf[7] = {'a','b','c','\0','e','f'};
string str1,str2,str3;
str1 = string(buf);
str2.assign(buf);
str3.assign(buf,sizeof(buf)/sizeof(char));
cout <<"when str1 = string(buf) :\nstr1 is\t" << str1<<endl;
cout <<"when str2.assign(buf): \nstr2 is\t" << str2<<endl;
cout <<"when str3.assign(buf,sizeof(buf)/sizeof(char)) : \nstr3 is\t" << str3<<endl;
return 0;
}
测试结果如下: