C++中用char数组构造string
在 C++
中如何使用用 char 数组
构造 string
,确实是一个老掉牙的话题,但是稍加不注意你就会出错。
最近在写一个可以跨平台打印的日志程序,遇到了这个问题,故记之,共勉!
用 char 数组初始化 string 示例
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <string>
using std::string; using std::cout;
int main(int argc, const char * argv[]) { char chArray[] = {'h', 'e', 'l', 'l'}; cout << "array size = " << sizeof(chArray)/sizeof(char) << endl; cout << chArray << endl; string str(chArray); cout << "str = " << str << " and str's size = " << str.length() << endl; }
|
针对上面的代码,不同的编译器输出结果不一致,具有一定的随机性。
在 macos 系统下,输出结果
1 2 3
| array size = 4 hell\310\367\277_\377 str = hell\310\367\277_\377 and str's size = 10
|
得到这种结果,简直要法克…
但是有时候输出结果又是下面那样的
1 2 3
| array size = 4 hell str = hell and str's size = 5
|
很明显,string
的 size
不对.
思考一下,原来是少了 ‘\0’,修改上面代码,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <string>
using std::string; using std::cout;
int main(int argc, const char * argv[]) { char chArray[] = {'h', 'e', 'l', 'l', '\0'}; cout << "array size = " << sizeof(chArray)/sizeof(char) << endl; cout << chArray << endl; string str(chArray); cout << "str = " << str << " and str's size = " << str.length() << endl; }
|
修改之后,代码的结果输出正常了。
1 2 3
| array size = 5 hell str = hell and str's size = 4
|
也就是说,char
数组初始化 string
对象,数组的结束符 ‘\0’ 不要忘记了。
另外,要注意 string
的 size
要比 char 数组
的 size
小。
不知道上面的东西,你有没有看明白?
那么下面的代码输出,你觉得会达到自己的预期吗?
1 2 3 4 5 6 7 8 9 10
| const char * cp = str.c_str(); unsigned long size = str.length(); char chArray2[size]; for (int i=0; i<size; i++) { chArray2[i] = cp[i]; cout << chArray2[i] << endl; }
string str2(chArray2); cout << "str2 = " << str2 << " and str2's size = " << str2.length() << endl;
|
这里很显然是错误的,至少两处是不对的。
1、chArray2
的大小;
2、chArray2
的结束符没有添加 ‘\0’;
修改一下,给出完整示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include <string>
using std::string; using std::cout;
int main(int argc, const char * argv[]) { char chArray[] = {'h', 'e', 'l', 'l', '\0'}; cout << "array size = " << sizeof(chArray)/sizeof(char) << endl; cout << chArray << endl; string str(chArray); cout << "str = " << str << " and str's size = " << str.length() << endl; const char * cp = str.c_str(); unsigned long size = str.length(); char chArray2[size + 1]; for (int i=0; i<size; i++) { chArray2[i] = cp[i]; cout << chArray2[i] << endl; } chArray2[size] = '\0'; string str2(chArray2); cout << "str2 = " << str2 << " and str2's size = " << str2.length() << endl; }
|
也许有人会说,为什么要用 char 数组
去构造 string
对象,用 char *
(指针)不是更好吗?
的确是这样,但是有时候需要 char
数组来操作,我也是把自己遇到的问题,加以总结跟大家分享一下。
把示例代码中的
1
| char chArray[] = {'h', 'e', 'l', 'l', '\0'};
|
修改为
1
| char chArray[] = "hell";
|
或者
1
| const char *chArray = "hell";
|
代码也可以正常正确的输出。
如果你有兴趣,可以看我之前总结的一篇文章 不见得你会计算C字符串长度, 🙇!
心若相知,无言也默契。