当前位置:首页 » 《随便一记》 » 正文

char[]、char*与string相互转换——独家原创

23 人参与  2022年11月15日 15:37  分类 : 《随便一记》  评论

点击全文阅读


必会知识点。

目录

一、talk is cheap

二、划重点

三、助记


一、talk is cheap

#include <iostream>#include <string>#include <cstring>using namespace std;int main() {    // char[] 转 char*、string,直接赋值    char ch0[] = "ali";    char *str00 = ch0;    str00[0] = 'x'; // str00指向的是array首地址,可以修改    string str01 = ch0;    cout << ch0 << endl; // xli    cout << str00 << endl; // xli    cout << str01 << endl; // xli    // char* 转 char[]、string    char tmp[] = "bli";    char *str10 = tmp;    char ch1[10] = {0};    strcpy(ch1, str10); // 用strcpy(dst, src)    string str11 = str10; // 直接赋值    str11[0] = 'd';    cout << str10 << endl; // bli    cout << ch1 <<endl; // bli    cout << str11 << endl; // dli    // string 转 char*、char[]    string str20 = "cli";    char* str21 = const_cast<char*>(str20.data()); // 用data(),c++11前不含/0,c++11后与c_str()相同    str20[0] = 'z'; // 可以修改    char* str22 = const_cast<char*>(str20.c_str()); // 用c_str(),含/0    char ch2[10] = {0};    strcpy(ch2, str20.c_str()); // 用strcpy(dst, src)配合c_str()    cout << str20 << endl; // zli    cout << str21 << endl; // zli    cout << str22 << endl; // zli    cout << ch2 << endl; // zli    return 0;}

二、划重点

不经思考是记不住的,让我们来看看为什么是这样转!

char[]是array,char*是pointer,string是c++定义的一个类型,字符串"ali"并不是string,字符串是const的不可修改,而sting是内置类装数据(比如"cli")和接口(比如c_string()),里面数据可以修改

字符串总是以'\0'结尾,char[]="ali",实际char[]存储了'a'、'l'、'i'、'\0'。既然这样,当然char[]转char*和string都可以直接赋值。char*转char[]要用strcpy(dst, src),char*转string直接赋值即可。string是个“盒子”,转其他格式当然要先取数据,用data()或c_str()。对于c++11俩接口没区别,c++11之前data()不含'\0'。但要注意data()或c_str()返回常量指针const char*,需要去const属性。既然返回的是const char*,转char[]当然就跟char*转char[]一样,用strcpy(dst, src)。

三、助记

转string,可以直接赋值。

转char*,char[]是直接赋值,string要c_str()取数据然后去const。

转char[],都要用strcpy(dst, src)。dst、src是指针。


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/48551.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1