美文网首页
C++中 string和char* 和char[]的区别和使用

C++中 string和char* 和char[]的区别和使用

作者: Kairk996 | 来源:发表于2022-01-02 10:51 被阅读0次

    区别:
    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();

    相关文章

      网友评论

          本文标题:C++中 string和char* 和char[]的区别和使用

          本文链接:https://www.haomeiwen.com/subject/vwjzqrtx.html