由于在C++项目中,经常遇到处理字符方面的问题,故借此机会整理一下,让自己对于char , string 等有进一步的了解。

  • 基本概念

由单引号括起来的一个字符成为char型字面值。双引号括起来的零个或多个字符则构成字符串型字面值。

'a' // 字符字面值
"Hello World!"//字符串字面值

  字符串字面值得类型=>由常量字符构成的数组,并在结尾处添加一个空字符('\0');因此字符串字面值的实际长度比它的内容多1。

'A'//单独的字符A"A"//包含两个字符,一个字母A,一个空字符。

  • C标准库String函数
strlen(p) 返回p的长度,空字符不计算在内,传入此类函数的指针必须纸箱以空字符作为结束的数组。
strcmp(p1,p2)

比较p1和p2的相等性。如果p1 == p2,返回0;如果p1>p2,返回一个正值;如果p1<p2,返回一个负值。

传入此类函数的指针必须纸箱以空字符作为结束的数组。

strcat(p1,p2) 将p2附加到p1之后,返回p1;传入此类函数的指针必须纸箱以空字符作为结束的数组。
strcpy(p1,p2) 将p2拷贝给p1,返回p1;传入此类函数的指针必须纸箱以空字符作为结束的数组。
char ca [] = {'C', '+', '+'};   //不以空字符结束
cout << strlen(ca)<<endl;   //错误,ca没有以空字符结束

当使用数组的时候,其实真正用的是指向数组首元素的指针。

混用string对象和C风格字符串

  1. 允许使用以空字符结束的字符数组来初始化string对象或为string对象赋值;
  2. 在string对象的加法运算中允许使用以空字符结束的字符数组作为其中一个运算对象(不能两个运算对象都是);在string对象的复合赋值运算中允许使用以空字符结束的字符数组作为右侧的运算对象。

上述返过来就不行,如下:

不能用string对象直接初始化指向字符的指针。为此,string提供了c_str的成员函数,来实现此效果。

string s("Hello World"); //可以,s内容是 Hello World
char * str = s; //错误
const char *str = s.c_str(); //正确 ,注意是 const char *

c_str函数返回结果是一个指针,指向一个以空字符结束的字符数组,而这个数组所存的数据恰好与那个string对象的一样。结果指针的类型是const char *,从而确保我们不会改变字符数组的内容。

注意:c_str()返回的数组无法保证一直有效,如果后续的操作改变了s的值,就可能让之前返回的数组失效。

如果执行完c_str()函数后程序想一直都能使用其返回的数组,最好将该数组重新拷贝一份。

  • 标准库类型 String

标准库string表示可变长的字符序列,首先要包含string头文件,且string定义在命名空间std中。

string s1 ;//默认初始化,s1是一个空串
string s2(s1);   // s2 是 s1 的副本
string s2 = s1; // 等价于s2(s1),s2 是s1的副本
string s3("value") ;//s3是字面值value的副本,不过没有后面的那个空字符
string s3 = "value";//等价于s3("value"),s3 是字面值"value"的副本。
string s4(n,'c'); // 把s4初始化为由连续n个字符c组成的串。

有关标准类型String对象上的操作有s.size()  s.empty() s1+s2 s1 = s2 s[n] s1==s2  < <= > >= !=

  • 数组方面

字符数组的特殊性:它有一种额外的初始化形式,可以用字符串字面值对此类数组初始化。

char a1[] = {'C', '+', '+'};//列表初始化,没有空字符
char a2[] = {'C', '+', '+','\0'}; // 列表初始化,含有显式的空字符
char a3[] = "C++" ;//会自动添加表示字符串结束的空字符
const char a4[6] = "Daniel"; //错误,没有空间可存放空字符

string 类型数组:

string a4[3] = {"hi","bye"};//等价于a4[] = {"hi","bye",""};

在C语言中,可以使用以下方式:

char *str ="hello world"; //但是这种方式在IOS C++11 运行下不行。

C语言有两种表示字符串的方法,一种是字符数组,另一种是字符串常量,它们在内存中的存储位置不同,使得字符数组可以读取和修改,而字符串常量只能读取不能修改。

#include <stdio.h>
int main(){char *str = "Hello World!";str = "I love C!";  //正确str[3] = 'P';  //错误return 0;
}

在编程过程中如果只涉及到对字符串的读取,那么字符数组和字符串常量都能够满足要求;如果有写入(修改)操作,那么只能使用字符数组,不能使用字符串常量。

这两种方式(字符数组和字符串指针)它们最根本的区别是在内存中的存储区域不一样,字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区。全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。

还有一点需要注意,就是当用到sizeof时:

char *str1 = "hello wrold";
char str2[] = "hello world";
cout<<sizeof(str1);   //8      机子是64位
cout << sizeof(str2);  //12

转载于:https://www.cnblogs.com/ycbeginner/p/9362481.html

char string 区别相关推荐

  1. CString与string、char*的区别和转换

    我们在C++的开发中经常会碰到string.char*以及CString,这三种都表示字符串类型,有很多相似又不同的地方,常常让人混淆.下面详细介绍这三者的区别.联系和转换: 各自的区别 char*: ...

  2. char *string=xxxxxxxxx 与 char string[]=xxxxx的区别

    char *string="xxxxxx" 这种方式使用的字面值模式,只读,不可以修改.string是个指针,这个字符串存放在程序的RODATA(read-only)段,不能修改的 ...

  3. java char的包装对象,Java 从Character和char的区别来学习自动拆箱装箱

    本文结构 1.Character和char 的区别: 2.自动拆箱装箱java 1.Character和char 的区别: Character是类,char基本数据类型.数组 在java中有三个类负责 ...

  4. c语言中 char怎样用,C语言中char*和char[]用法区别分析

    C语言中char*和char[]用法区别分析 本文实例分析了C语言中char* 和 char []的区别.分享给大家供大家参考之用.具体分析如下: 一般来说,很多人会觉得这两个定义效果一样,其实差别很 ...

  5. byte,int,char的区别

    什么是byte byte,即字节,由8位的二进制组成.在Java中,byte类型的数据是8位带符号的二进制数. 在计算机中,8位带符号二进制数的取值范围是[-128, 127],所以在Java中,by ...

  6. cstring与string区别联系

    cstring和string区别与联系 string.string.h和cstring的区别是很大的.string.h是c语言的库,用于处理char *类型的字符串.string和cstring是c+ ...

  7. mysql char30_Mysql中varchar与char的区别以及varchar(30)中的30代表的涵义

    mysql中varchar与char的区别以及varchar(30)中的30代表的涵义 (1)varchar与char的区别 varchar存储可变长字符串,小于255字节时需要1个额外字节(大于25 ...

  8. char* 和 char[]的区别

    #char* 和 char[]的区别 从一开始写c 程序,我就一直有一个疑惑,当自己动手写的时候这个问题依旧存在,这引起了我的思考,这也许是一个很基础的问题但是确实一个十分重要的问题,不能眼高手低,踏 ...

  9. C语言中char*和char[]用法区别分析

    本文实例分析了C语言中char * 和 char []的区别.分享给大家供大家参考之用.具体分析如下: 一般来说,很多人会觉得这两个定义效果一样,其实差别很大.以下是个人的一些看法,有不正确的地方望指 ...

最新文章

  1. docker 进入容器 开启一个新的bash窗口
  2. 一个简单的javascript节流器实现
  3. 45个极具冲击力的WordPress摄影网站模板
  4. linux中向空文件写入内容,linux – 为什么写入现有文件比写一个新的空文件更快?...
  5. 3h精通OpenCV(一)- 读取图像视频与网络摄像头
  6. python测试代码运行时间_在Python中准确地测量代码执行时间
  7. 嗅探TFTP配置文件传输
  8. 10.7 a.m.小结
  9. spring mybatis 项目源码
  10. java 计算限行尾号(北京)
  11. php网页版进销存源码ERP多仓库管理系统源码
  12. taro开发微信小程序配置全局appid
  13. 计算机用户删除文件找回,电脑删除的文件怎么找回?失易得数据恢复帮助找回...
  14. 为什么我会性格懦弱?如何改变懦弱的性格?
  15. java geohash_GitHub - GongDexing/Geohash: GeoHash是目前比较主流实现位置服务的技术,用最简洁的Java实现GeoHash算法...
  16. Linux下文件丢失问题
  17. Velocity是什么?
  18. 计算机原理学习(1)-- 冯诺依曼体系和CPU工作原理
  19. 利用自定义方法显示数组中的全部数据
  20. 筑本T8神奇魔轮 专卖网站(全国货到付款,7天无条件退货)

热门文章

  1. redis源码之sds
  2. MySQL第2天:MySQL的架构介绍之MySQL介绍
  3. eclipse如何导出WAR包
  4. springboot-web开发(请求映射原理)
  5. 常考数据结构与算法:二叉树的之字形层序遍历
  6. 汇编: cli, sti
  7. Oracle 默认时间格式 Date格式转换
  8. elasticsearch-查询基础篇
  9. Python OOP
  10. C++ 创建引用DLL