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

很明显,stringsize 不对.

思考一下,原来是少了 ‘\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’ 不要忘记了。

另外,要注意 stringsize 要比 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[] ---> string
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;
// string --> char[]
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字符串长度, 🙇‍!


心若相知,无言也默契。

坚持原创技术分享!