C++的string与char 数组的区别

    xiaoxiao2023-11-17  134

    区别: char *s1:s1是一个指向字符串的指针; char s2[]:s2是一个字符数组; string s3:s3是一个string类的对象.

    【内存模型】 例如: char *s1 = "hello"; char s2[] = "hello"; 内存模型如下        +-----+     +---+---+---+---+---+---+    s1: |  *======> | h | e | l | l | o |\0 |        +-----+     +---+---+---+---+---+---+        +---+---+---+---+---+---+    s2: | h | e | l | l | o |\0 |        +---+---+---+---+---+---+

    转换: 1.string转换为char *: 如果要将string直接转换成const char *类型。string有2个函数可以运用。

    一个是.c_str(),一个是.data成员函数。

    例子如下:     string s1 = "abcde";     const char *k = s1.c_str();     const char *t = s1.data();     printf("k:[%s] t:[%s]\n", k, t);     system("pause");

    如上,都可以输出。内容是一样的。但是只能转换成const char*,如果去掉const编译不能通过。(const char *指向的内存依赖string对象的生命周期)

    那么,如果要转换成char*,可以用string的一个成员函数copy实现。(因为内存是char *独立维护的,新申请的。等价于两份拷贝)

        string s1 = "abcde";     char *data;     int len = s1.length();     data = (char *)malloc((len + 1)*sizeof(char));     s1.copy(data, len, 0);     data[len] = '\0';     printf("data:%s\n", data);     printf("s1:%s\n", s1.c_str());

    2.char *转换成string: 可以直接赋值(是内存拷贝赋值) string s; char *p = "adghrtyh"; s = p; 注: 当我们定义了一个string类型之后,用printf("%s",s);输出是会出问题的。这是因为“%s”要求后面的对象的首地址。但是string不是这样的一个类型。所以肯定出错。用cout输出是没有问题的,若一定要printf输出。那么可以这样:printf("%s",s.c_str())。

    3.char[] 转换成string: 同char *转换成sting

    4、string转换成char[]:     char buf[10];     char nbuf[10];     string str("abcdeg");     strcpy(buf, str.c_str());     strncpy(nbuf, str.c_str(), str.length());     buf[str.length()] = '\0';     nbuf[str.length()] = '\0';     printf("buff:[%s] nbuff:[%s].\n", buf, nbuf);

    5、QString 转换为 const char *: (const char *)(QString).toLocal8Bit();

    总结: 通过上述的转换可以发现,其核心仍是紧紧抓住了三者之间的区别。我们应从三者的区别入手,去体会他们之间的转换。

    参考文章:

    1、char* char[]及string的区别及相互转换

    2、string 与char* char[]之间的转换

    3、c++中char与string之间的相互转换问题

    推荐阅读:

    char数组与string转换 ---------------------  作者:fzzjoy  来源:  原文:https://blog.csdn.net/u010275850/article/details/77512695

    最新回复(0)