字符串简介:
字符串是存储在内存中连续字节的一系列字符。C++中处理字符串有两种风格,一种来自C语言,叫做C语言风格;另一种风格基于string库,我们姑且叫string库风格。其中C语言风格,利用了字符串储存在内存中连续字节的特点,将字符串储存在字符数组中,以‘\0’结尾;而string库风格提供的方法,允许程序员将字符串作为变量来使用,接下来将分别介绍这两种风格。

1.C语言风格
(1)字符串和字符数组
C语言风格的处理方式是将字符串置于字符数组中,每个字符位于一个数组元素之中,并且以空字符(’\0’)结尾。以空字符结尾对C语言风格的字符串来说非常重要,这是区别字符串和字符数组的标志,比如:

char a[5] = {'1','2','3','4','5'};   //这是一个字符数组
char b[5] = {'1','2','3','4','\0'};  //这是一个字符串

同时,字符串结尾的空字符也是很多函数判断是否到达字符串结尾的标志,如果将字符串中的某个元素设置为’\0’,那么很多函数会错误的判断字符串的结尾位置并带来错误,比如:

char dog[6] = {'T','e','d','d','y','\0'}; //定义一个字符串Teddy cout<<"改变前: "<<dog<<"\n";             //cout会输出直到遇到末尾的空字符为止 dog[2] = '\0';                            //将字符'd'改为空字符 cout<<"改变后: "<<dog;

这样一个代码段执行结束以后的结果将是:

如果用户不将字符数组结尾设置为空字符,cout函数将继续将内存后面的内容解释为要打印的元素直到遇到空字符为止,但是由于空字符在内存中很常见,所以输出也将很快停止,这大多不会影响输出,但是用户仍然不应该将非空字符结尾的字符串当作字符串使用。
(2)字符串的初始化
字符串的初始化可以刚刚的范例中的那样做,使用单引号分隔单个字符并在末尾加上空字符,但这样不免繁琐。更简洁的将字符数组初始化为字符串的方式是用双引号("")将内容括起。这种字符串叫做字符串常量,或者字符串字面值。用引号括起的字符串隐式包含了结尾的空字符,不需要人为添加,但应记得为其预留位置。在这样输入字符串的时候,我们可以手动设置字符数组长度,也可以让编译器自动计算空间,比如:

 char dog[6] = "Teddy"  //人为设置,预留一个空字符的位置char cat[] = "Persion" //编译器计算

需要注意的是,应当为字符串分配足够大的空间,如果分配的空间存在没用完的部分,将自动被设置为空字符’\0’
(3)字符串的拼接以及对字符串中字符操作
在C语言风格中,算术运算符’+‘不会被解释为字符串的拼接,所以不能直接使用’+'拼接两个字符串。可以使用函数strcat()达到目的,但是需要使用到string库,所以放在下面进行讲解。
在明白字符串和字符数组的关系后,就可以利用数组的性质对字符串中的字符进行操作,比如实现一个单词的大小写转化:

char dog[6] = "Teddy"; for (int i=0;i<6;i++){  //如果未知长度,可以使用strlen(dog)获取if(dog[i]<'Z' && dog[i]>'A'){dog[i] += 32;}else{dog[i] -= 32;

(4)字符串输入
和字符数组一样,字符串可以使用cin进行输入。但是cin使用空白(空格,换行符,制表符)确定输入边界,这意味着输入的字符串中不能含有空格(一次性只能输入一个单词),这样的问题是很明显的。
但实际上,如果空格和换行符在确认边界上有同样的效果,那么是不是意味着在运行程序时也会出现同样的结果呢?比如下面的一段代码:

char name[10];char food[10];cout<<"What is your name:";cin>>name;cout<<"What is your favorite food:";cin>>food;cout<<name<<" likes "<<food;

如果使用换行符,即使用回车来分隔两个字符串,运行范例是:

看起来似乎没什么问题,但如果使用空格来分割呢?

在这种情况下,程序员尚未对输入最喜欢的食物做出反应,程序已经将其显示了出来。这是因为使用空格以后,rice被留在了输入队列中,故当程序在输入队列搜索输入结果时发现了留在其中的rice,直接读取存入字符串中,这样也就不需要用户再输入了。
首先,一次性只能输入一个单词肯定是不好的,但是istream中的类提供了一些类成员函数,可以面向行进行输入,即是说仅把换行符(按下enter)作为输入结尾标志。这样的函数有getline()和get()两种。
区别在于getline()将会读取换行符并舍弃,而get()将保留换行符在输入队列中。这两种函数的一般形式为:cin.getline(arrayName,arrayLenth)和cin.get(arrayName,arrayLenth);代表将输入放到arrayLenth长度的arrayName的数组中去。这样就能解决使用空格作为输入边界带来的一些问题了,比如:

char name[15];cout<<"input name:";cin.getline(name,15);cout<<name;

测试范例为:

可以看到此时就可以输入含有空格的字符串了!
但是我们需要注意,由于get()函数将回车留在了队列中,可能需要另一个get()来读取回车,否则会给输入带来问题,比如:

 char pets[10];char food[10];cin.get(pets,10);cin.get();   //抵消留在输入队列中的字符串,也可以使用getchar() cin.get(food,10);cout<<pets<<"\n";cout<<food;

2.string库风格(加入cstring或者string.h)
通过添加string类扩展了C++库,现在就可以使用string类型的变量而不是字符数组储存字符串。现在可以这样定义字符串了:

string pets = "dog and cat";

(1)赋值,拼接和附加

 string first_name;string last_name;first_name = "Mercer";  //给字符串变量赋值 last_name = "Alex";cout<<last_name+" ,"+first_name; //此处的"+"解释为字符串拼接

(2)和字符数组的联系
实际上string类定义隐藏了字符串的数组性质,实际上string和字符数组存在很多相同,也存在一些不同,下面以一个测试程序为例:

 string first_name = "Alex";  //可以用C风格字符串初始化字符串对象 string last_name;cin>>last_name;              //可以使用cin从键盘读取到string对象中cout<<"full_name: "<<first_name+last_name<<"\n";//可以用cout输出 cout<<first_name[0];         //可以使用数组表示法输出字符串中的字符

(3)string的输入
string类可以使用cin和>>进行输入,但是和C语言风格一样,面对空格可能带来的问题。但是之前的C语言风格中,我们使用getline(),get()时,需要确定字符数组的名称和长度,但是string类隐去了数组性质,又如何输入呢?可以使用函数getline(cin,str)来进行输入,例如:

 string full_name;getline(cin,full_name);

(4)一些常用函数
①strcpy --将字符串复制到字符数组中
strcpy(a,b),将数组b复制到a中,会覆盖原来a中的内容;

 char a[4] = "123";char b[4] = "456";cout<<strcpy(a,b);

结果为

②strcat --将字符串附加到字符串末尾
strcat(a,b),将数组b附加到a末尾,同样是刚刚的例中

 char a[4] = "123";char b[4] = "456";cout<<strcat(a,b);

结果为:

③strlen --输出字符串长度

 char a[4] = "123";cout<<strlen(a);

结果为:

这里需要注意,字符数组长度为4,而输出的长度为3,这是因为预留的一个元素位置是为引号括起的内容隐式添加的’\0’留的,而strlen()函数遇到空字符停止,不会将其计入字符串长度,这里也侧面反应了上面我们对C语言风格字符串初始化的观点。

【C++】字符串详解相关推荐

  1. python 字符串替换_Python基础教程,第四讲,字符串详解

    本节课主要和大家一起学习一下Python中的字符串操作,对字符串的操作在开发工作中的使用频率比较高,所以单独作为一课来讲. 学完此次课程,我能做什么? 学完本次课程后,我们将学会如何创建字符串,以及如 ...

  2. python字符串是什么_python字符串详解

    字符串详解 在python中引号引起来的就是字符串 字符串是用来存储少量数据 索引 索引(下标) 通过索引可以精确的定位到某个元素 name = "meat" meat 每一个字母 ...

  3. 判断字符串格式_Python基础教程,第四讲,字符串详解

    本节课主要和大家一起学习一下Python中的字符串操作,对字符串的操作在开发工作中的使用频率比较高,所以单独作为一课来讲. 学完此次课程,我能做什么? 学完本次课程后,我们将学会如何创建字符串,以及如 ...

  4. MS SQL Server 数据库连接字符串详解

    MS SQL Server 数据库连接字符串详解 问题 : 超时时间已到.在从池中获取连接之前超时时间已过.出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小. 解决办法 1. 在代码里面 ...

  5. EditPlus正则表达式替换字符串详解

    EditPlus正则表达式替换字符串详解 发布时间:April 8, 2007 分类:Regular <PHP 实现多服务器共享 SESSION 数据> <利用javascript在 ...

  6. Python基础语法day02字符串详解和列表

    今天是python基础语法入门第二天,大概总共会有四天左右.四天后就是对于python的numpy库的详细文章.那话不多说,我们开始. 目录 字符串详解 字符串独有功能 检测头尾字符 判断输入结果是否 ...

  7. C语言 字符数组 和 字符串 详解

    C语言 字符数组 和 字符串 详解 用来存放字符的数组称为字符数组,例如: char a[10]; //一维字符数组 char b[5][10]; //二维字符数组 char c[20]={'c', ...

  8. python中的字符串详解(附实现文字跑马灯效果)

    python中的字符串详解 1.什么是字符串 ​ 相信大家对字符串应该是再熟悉不过了吧,因为日常生活中的一句话,或是路边的一则广告,其实它都相当于一个字符串,而顾名思义,字符串也就是一串串的由零个或多 ...

  9. 站长在线Python精讲:在Python中使用split()方法分割、使用join()方法合并字符串详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中使用split()方法分割.使用join()方法合并字符串详解>.本知识点主要内容有:在Python中使用s ...

  10. 站长在线python精讲:在Python中使用“+”运算符来拼接字符串详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中使用"+"运算符来拼接字符串详解>.本知识点主要内容有:在Python中,我们可以使用& ...

最新文章

  1. Linux的make 命令出现:make:*** No targets specified and no makefile found.Stop
  2. 洛谷1090 合并果子
  3. python爬虫技术路线_爬虫学习——中国大学最好排名(技术路线:requests库和bs4)(来源于北理工Python网络爬虫与信息提取网络公开课)...
  4. 粒子群matlab工具箱,科学网—PSO粒子群优化算法Matlab工具箱 - 白途思的博文
  5. 全国高校计算机能力挑战赛C语言组真题
  6. xp系统打印服务器自动关闭,xp打印机服务器设置
  7. 基于Springboot+MYSQL实现在线点餐系统源码
  8. 伺服电机选型时,惯量匹配和惯量比的问题
  9. matlab各向异性高斯核方向导数滤波器,基于各向异性高斯方向导数滤波器提取图像粗边缘的方法...
  10. 35岁后你的职场危机,你该何去何从
  11. RuntimeError: Cannot re-initialize CUDA in forked subprocess. 一个奇怪bug的奇妙解决方法
  12. 学计算机应该具备什么能力,学习计算机专业该具备那些能力?
  13. 大型开源车牌数据集CCPD及私有车牌数据集介绍
  14. 实习生招聘收割阿里、腾讯等大厂Offer后,有些话想和应届生说
  15. 熔化焊接与热切割作业实操实训考核装置
  16. (转)关于无良培训机构的恶意抹黑疯狂Java的反驳(v1)
  17. db2 EXPLAIN分析SQL
  18. python 模拟微信浏览器请求_如何用Python模拟登录微信,抓取所有好友个人信息!微信后台很强...
  19. 计算机中丢失vba,电脑打开Excel提示vbaen32.olb损坏或丢失怎么回事_电脑打开Excel提示vbaen32.olb损坏或丢失如何解决...
  20. 安卓小项目之EveryDay(6)----使用第三方平台获取短信验证码

热门文章

  1. Gerber Output Options - from A.D. Company offical forum
  2. 中国欢迎国际社会利用“鹊桥”号中继卫星开展科学研究
  3. 怎样快速写出热点文章,紧跟热点热度?
  4. 聊聊运维(03)IT创业必看美剧《硅谷》
  5. mysql函数学习:IF()、IFNULL()、ISNULL()、NULLIF()
  6. RanorexStudio使用遇到的问题
  7. 数字科技企业研发实力榜 TOP 50 ,华为千亿研发排第一
  8. 计算机术语 抖动,解决方案:如果计算机屏幕闪烁和抖动,该怎么办
  9. 根据手柄操控仿真机器人
  10. Android全面屏适配指南