【C++】18.char[] 与 string 的区别 与 互相转化、c_str() 函数用法

原文链接:https://blog.csdn.net/weixin_43273685/article/details/101836630
注意:原文中有一些错误,我这里做了修改。


char*string的本质区别是:

string是一个容器,c++中封装了一个string类,功能极其强大,而char*则是一个指针,指向一个数组首地址


1. char []或者char*string转换

char*string转换支持隐式类型转换,即:

// 方法1:
char c[] =  {'1','2','a'}; // @zhz:推荐写成 char c[] ="12a";
std::string str1 = c ;

// 方法2
// char* p = "abc"; //"warning: ISO C++ forbids converting a string constant to ‘char*’ "
char* p = (char*)"abc"; //OK,加上类型转换就没有警告了
char const *p="abc";//OK

// 可通过std::string(ch[0])获取到"aaa",std::string(ch[1])获取到"bbb".
char *ch[] = {"aaa","bbb"};   
std::string str2=std::string(ch[0]);

注意区分to_string()函数的用法,不要混淆。

他的功能是 将数值转化为字符串。返回对应的字符串
函数原型:

string to_string (int val);
string to_string (unsigned val);
string to_string (float val);
string to_string (double val);
...
...

2. stringchar*

stringchar*一般需要用到一个c_str()函数;

std::string str2("456");
const char*  ch = str2.c_str();  //@zhz:必须加上const,否则会报错:不能把 const char*类型赋值给 char *
3. c_str()函数用法

原文链接: http://blog.csdn.net/Nancy_m/article/details/7583550
语法:
const char *c_str();
c_str()函数返回值: 返回一个指向正规C字符串的指针常量, 内容与本string串相同.
这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()string对象转换成c中的字符串样式。
注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针

下面这种方式会出错:
// @zhz:错误用法
char* c; 
std::string s="1234"; 
c = s.c_str();     //出错,不能把 const char*类型赋值给 char *

上面c最后指向的内容是垃圾,因为s对象被析构,其内容被处理,同时,编译器也将报错:将一个const char *赋与一个char *

应该这样用:
//正确用法
char c[20]; //@zhz:注意,不要写成 char *c;
std::string s="1234"; 
strcpy(c,s.c_str()); 

这样才不会出错, c_str()返回的是一个临时指针const char *,不能对其进行操作

再举个例子:

c_str()char*形式传回 string 内含字符串
如果一个函数要求char*参数,可以使用c_str()方法:

string s = "Hello World!";
printf("%s", s.c_str()); //输出 "Hello World!"

4. @zhz:下面是我自己测试的代码:
// char *c = "asd";    // 不推荐,会出现 "warning: ISO C++ forbids converting a string constant to ‘char*’ "
char *c = (char*)"asd";  //推荐   
// char c[] = {'1', '2', '3'};    // 注意有引号,不能写成 char c[] = {1,2,3};,否则cout打印会出现乱码
//  char *c[] = {"aaa","bbb"};   // 可通过std::string(c[0])获取到"aaa",std::string(c[1])获取到"bbb".
// char c[] = {'a','b'};          // 不推荐这种方式, 否则当只有两个字符时,使用std::cout << "str1= " << str1 << std::endl;会多打印出一个@符号
char c[] = "ab";                  // 推荐这种方式
printf("%s\n", c);  //c语言方式打印字符串数组c[]

std::string str1 = c;

// 1.下面使用c语言方式printf()函数打印string字符串,需要 #include <string.h>
printf("str1= %s\n",str1.c_str());

// 2.下面使用c++方式std::cout打印string字符串
std::cout << "str1= " << str1 << std::endl;

strcpy
char ch[20];     //注意,不要写成 char *ch;
std::string s="1234"; 
strcpy(ch,s.c_str()); 
// 注意,如果写成 printf("%c", ch);会有警告"warning: format ‘%c’ expects argument of type ‘int’, but argument 2 has type ‘char*’ "
printf("%s", ch);  
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值