原文链接: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. string
转char*
而string
转char*
一般需要用到一个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);