字符数组
字符数组与字符串
- 由一系列字符组成的一个处理单位称为字符串,如一个单词或一个句子。
- C++ 中的字符串常量是用一对双引号括起来,由
'\0'
作为结束符的一组字符。
- C++ 中的字符串常量是用一对双引号括起来,由
Tips:不含任何字符的字符串称为空字符串,用一对双引号表示,即 ""
。空字符串并不是不占空间,而是占用了 11 字节的空间,这个字节中储存了一个 '\0'
。
- 通常用一个字符数组来保存字符串,即所有元素的类型都是字符型的数组
- 由于字符串以
'\0'
作为结束符,因此所需的储存空间比实际的字符串长度大 11。
- 由于字符串以
字符数组的输入输出
字符数组可以进行逐个字符的输入输出,这种做法和普通的数组操作一样,分为以下两种方式:
-
将整个字符串一次性地用对象
cin
和cout
的>>
和<<
操作完成输入或输出。 -
通过
cin
的成员函数get
或getline
输入。 -
方式一:使用
cin
和cout
-
对于字符数组
userName
,输入一个字符串到数组中,可以使用语句:cin >> ch;
- 输入的时候,使用
cin
语句,会不断的读入字符串,直到遇到一个空白字符(空格、回车或者制表符)就结束读入 - 用
cin
向计算机输入一串字符时,输入的字符的数量应该少于已定义的字符数组的长度,否则会出现问题 - 如果输入的字符的数量小于字符数组长度时,剩下的部分会默认补上
'\0'
- 输入的时候,使用
-
对于字符数组
userName
,输出其中的内容:cout << ch;
- 从字符数组的第一个字符开始输出,直到遇到
'\0'
(不会输出'\0'
) - 如果一个字符数组中包含一个以上
'\0'
,则遇第一个'\0'
时cout
输出就结束
- 从字符数组的第一个字符开始输出,直到遇到
-
-
方式二:用
scanf
printf
也可以输入输出字符串,有以下一些需要注意的点:-
字符的输入用
scanf("%c", &变量名)
,而输入一个字符串用
scanf("%s", 数组名)
scanf("%s", userName);
- 注意,因为是字符串也是一个字符数组,
scanf
里,数组前不需要加&
,只有变量名字需要加&
。
- 注意,因为是字符串也是一个字符数组,
-
字符的输出用
printf("%c", &变量名)
,而输出一个字符串用
printf("%s", 数组名)
printf("%s", userName);
-
字符数组型字符串的常用操作
字符串不能用系统的内置运算符进行操作,C++语言设计了一个 cstring
库,提供了一些用来处理字符串的函数。
-
连接字符串
使用
strcat(s1, s2)
函数可以把字符串s2
连接到s1
的末尾。 -
获取字符串长度
使用
strlen(s1)
函数可以返回字符串s1
的有效字符数。比如"yes"的长度就是3。 -
比较字符串的字典序
使用
strcmp(s1, s2)
函数可以比较两个字符串之间的字典序:如果s1
和s2
是相同的,会返回0;如果s1
的字典序在s2
前面,则返回值会小于0;如果s1
的字典序在s2
后面,则返回值会大于0。 -
复制字符串
使用
strcpy(s1, s2)
函数可以复制字符串s2
到字符串s1
。如果s2
比s1
短,那么s1
这个数组后面没被覆盖的部分不会改变。比如s1
存的是{q, w, e, r, \0}
,s2
存的是{a, s, \0}
,那么使用strcpy(s1, s2)
后,s1前五位应该是{a, s, \0, r, \0}
。
String类型
string 类型的基本操作
- 字符数组型字符串是把字符串当作一个元素为字符的一维数组,而 string 类型是直接把字符串当作一个整体,可以像整型变量、字符变量一样使用。
string 类型的用法有以下一些注意点:
-
头文件
- 首先需要加载 string 类型所在的头文件。
# include <string>
-
声明和初始化
- string 类型的声明和初始化和普通变量一样。
// 声明 string a; // 声明与初始化 string b = "yes";
-
输入输出
- string 类型的字符串一般直接通过
cin
和cout
进行输入输出。- 输入的时候,使用
cin
语句,会不断的读入字符串,直到遇到一个空白字符(空格、回车或者制表符)就结束读入 - 输出的时候,从字符串中第一个字符开始输出,直到遇到
'\0'
(不会输出'\0'
)
- 输入的时候,使用
- string 类型的字符串一般直接通过
string 类型的常用操作
对于string 类型的字符串,官方提供了一些字符数组型字符串常用处理函数,可以对字符数组型的字符串进行一些常规操作。本节选取抽取一些常用操作,和字符数组型字符串对照讲解一下:
-
连接字符串
- 字符数组型字符串会使用
strcat(s1, s2)
函数把字符串s2
连接到s1
的末尾。 - string 类型可以直接使用
s1 + s2
连接两个字符串。
- 字符数组型字符串会使用
-
获取字符串长度
- 字符数组型字符串会使用
strlen(s1)
函数返回字符串s1
的字符数。 - string 类型可以直接使用
s1.size()
或者s1.length()
返回字符串s1
的字符数。
- 字符数组型字符串会使用
-
比较字符串的字典序
-
字符数组型字符串会使用
strcmp(s1, s2)
函数比较两个字符串之间的字典序:
- 如果
s1
和s2
是相同的,会返回0 - 如果
s1
在s2
前面,则返回值会小于0 - 如果
s1
在s2
后面,则返回值会大于0
- 如果
-
string 类型可以直接使用关系运算符来比较两个字符的字典序:
- 如果
s1 < s2
为1
(真),就表示s1
的字典序在s2
前面 - 如果
s1 < s2
为0
(假),就表示s1
的字典序不在s2
前面
- 如果
-
-
复制字符串
- 字符数组型字符串使用
strcpy(s1, s2)
函数复制字符串s2
到字符串s1
。 - string 类型可以直接使用赋值表达式
s1 = s2
来复制字符串s2
到字符串s1
。
- 字符数组型字符串使用
string 类型的其他操作
另外,还有一些 string 类型的其他非常方便的操作函数,详见下面的表格:
- 字符数组型字符串使用
strcpy(s1, s2)
函数复制字符串s2
到字符串s1
。 - string 类型可以直接使用赋值表达式
s1 = s2
来复制字符串s2
到字符串s1
。
string 类型的其他操作
另外,还有一些 string 类型的其他非常方便的操作函数,详见下面的表格: