【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. 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);
【C++】18.char[] 与 string 的区别 与 互相转化、c_str() 函数用法相关推荐
- char*与string的区别
char* 与string的本质区别是string是一个容器,c++在中封装了一个string类,功能极其强大,而char*则是一个指针,指向一个数组的首地址. char*向string转换支持隐式类 ...
- JAVA中char和string的区别
1.char表示字符,定义时用单引号,只能存储一个字符,如char c='x'; 而String表示字符串,定义时用双引号,可以存储一个或多个字符,如String name="tom&quo ...
- c 串转string_c++ 中 char 与 string 之间的相互转换问题
string::c_str().string::data()的区别: const value_type *c_str( ) const; const value_type *data( ) const ...
- C++ 字符串、string、char *、char[]、const char*的转换和区别
1.字符串 字符串本质就是一串字符,在C++中大家想到字符串往往第一反应是std::string(后面简称string) 字符串得从C语言说起,string其实是个类,C语言是没有class的,所以C ...
- mysql数据库varchar的区别_MySQL数据库char与varchar的区别分析及使用建议
在数据库中,字符 型的数据是最多的,可以占到整个数据库的80%以上.为此正确处理字符型的数据,对于提高数据库的性能有很大的作用.在字符型数据中,用的最多的就是 Char与Varchar两种类型.前面的 ...
- C 风格字符串与C++中string类区别
1. 概述 字符串是若干个有效字符(字母.数字.专用字符.转义字符等)的序列.C语言中没有字符串变量,字符串不是存放在一个变量中,而是存放在一个字符型数组中.因此,为了存放字符串,常常在程序中定义字符 ...
- [转]wchar_t char std::string std::wstring CString 转换
[转]wchar_t char std::string std::wstring CString 转换 1 #include <string> 2 // 使用CString必须使用MFC, ...
- 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 ...
- [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 ...
最新文章
- mysql主备在同一台_MySQL高可用(一)主备同步:MySQL是如何保证主备一致的
- Android数据存储的三种方式-SharedPrefrences,File,SQLite
- MULE ESB中的一些值得关注的地方
- 同学你好,听说你想学习做硬件?
- 2021-07-05-日历
- whitepages 爬取_运营笔记:是时候了解蜘蛛爬取原理了!揭秘收录难题!
- windows中启动 java -jar 后台运行程序
- 八数码深度优先搜索_树的深度优先搜索(上)
- r语言 悲观剪枝_R语言实战(5) ——高级数据管理
- php如何获取li标签中的值,多个 (li) 标签如何获取获取选中的里面的某个特定值??...
- 成人高考专升本- 你需要知道的事情!!
- 一文搞懂Handler机制原理
- 挑选开关电源的工作频率是依据什么?
- SecureCRT 安装与破解教程
- cmake的使用(cmake不是内部或外部命令)
- TIdTCPClient
- 肯德基真的没有什么太多吃的谨慎洋…
- SQLite封锁机制
- Node.js 学习之数据库与身份认证
- 老干妈怒了:我才是中国第一!
热门文章
- 爬过这 6 个坡,你就能对 Linux 操作系统了如指掌
- 微服务实战(四):服务发现的可行方案以及实践案例
- spring boot actuator工作原理之http服务暴露源码分析
- zookeeper源码分析之三客户端发送请求流程
- 数据科学教程:R语言与DataFrame[2016版]
- 如何搭建一套融资租赁业务系统
- Tomcat - Tomcat 8.5.55 启动过程源码分析阶段三_start阶段
- 小工匠聊架构-写给研发工程师的全链路压测
- 白话Elasticsearch14-深度探秘搜索技术之基于multi_match 使用most_fields策略进行cross-fields search弊端
- 并发编程-17AQS同步组件之 Semaphore 控制并发线程数的信号量