原文链接: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);

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

  1. char*与string的区别

    char* 与string的本质区别是string是一个容器,c++在中封装了一个string类,功能极其强大,而char*则是一个指针,指向一个数组的首地址. char*向string转换支持隐式类 ...

  2. JAVA中char和string的区别

    1.char表示字符,定义时用单引号,只能存储一个字符,如char c='x'; 而String表示字符串,定义时用双引号,可以存储一个或多个字符,如String name="tom&quo ...

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

    string::c_str().string::data()的区别: const value_type *c_str( ) const; const value_type *data( ) const ...

  4. C++ 字符串、string、char *、char[]、const char*的转换和区别

    1.字符串 字符串本质就是一串字符,在C++中大家想到字符串往往第一反应是std::string(后面简称string) 字符串得从C语言说起,string其实是个类,C语言是没有class的,所以C ...

  5. mysql数据库varchar的区别_MySQL数据库char与varchar的区别分析及使用建议

    在数据库中,字符 型的数据是最多的,可以占到整个数据库的80%以上.为此正确处理字符型的数据,对于提高数据库的性能有很大的作用.在字符型数据中,用的最多的就是 Char与Varchar两种类型.前面的 ...

  6. C 风格字符串与C++中string类区别

    1. 概述 字符串是若干个有效字符(字母.数字.专用字符.转义字符等)的序列.C语言中没有字符串变量,字符串不是存放在一个变量中,而是存放在一个字符型数组中.因此,为了存放字符串,常常在程序中定义字符 ...

  7. [转]wchar_t char std::string std::wstring CString 转换

    [转]wchar_t char std::string std::wstring CString 转换 1 #include <string> 2 // 使用CString必须使用MFC, ...

  8. Java char转换为String,String转换为char数组

    Today we will look into java char to String program. We will also learn how to convert String to a c ...

  9. [CareerCup] 18.8 Search String 搜索字符串

    18.8 Given a string s and an array of smaller strings T, design a method to search s for each small ...

最新文章

  1. mysql主备在同一台_MySQL高可用(一)主备同步:MySQL是如何保证主备一致的
  2. Android数据存储的三种方式-SharedPrefrences,File,SQLite
  3. MULE ESB中的一些值得关注的地方
  4. 同学你好,听说你想学习做硬件?
  5. 2021-07-05-日历
  6. whitepages 爬取_运营笔记:是时候了解蜘蛛爬取原理了!揭秘收录难题!
  7. windows中启动 java -jar 后台运行程序
  8. 八数码深度优先搜索_树的深度优先搜索(上)
  9. r语言 悲观剪枝_R语言实战(5) ——高级数据管理
  10. php如何获取li标签中的值,多个 (li) 标签如何获取获取选中的里面的某个特定值??...
  11. 成人高考专升本- 你需要知道的事情!!
  12. 一文搞懂Handler机制原理
  13. 挑选开关电源的工作频率是依据什么?
  14. SecureCRT 安装与破解教程
  15. cmake的使用(cmake不是内部或外部命令)
  16. TIdTCPClient
  17. 肯德基真的没有什么太多吃的谨慎洋…
  18. SQLite封锁机制
  19. Node.js 学习之数据库与身份认证
  20. 老干妈怒了:我才是中国第一!

热门文章

  1. 爬过这 6 个坡,你就能对 Linux 操作系统了如指掌
  2. 微服务实战(四):服务发现的可行方案以及实践案例
  3. spring boot actuator工作原理之http服务暴露源码分析
  4. zookeeper源码分析之三客户端发送请求流程
  5. 数据科学教程:R语言与DataFrame[2016版]
  6. 如何搭建一套融资租赁业务系统
  7. Tomcat - Tomcat 8.5.55 启动过程源码分析阶段三_start阶段
  8. 小工匠聊架构-写给研发工程师的全链路压测
  9. 白话Elasticsearch14-深度探秘搜索技术之基于multi_match 使用most_fields策略进行cross-fields search弊端
  10. 并发编程-17AQS同步组件之 Semaphore 控制并发线程数的信号量