在字符串入门部分,我们主要讲解一下字符串的两种表示方式:
- 字符数组
char s[100]
; - 字符串
string
。
字符数组
我们用 char
定义一个字符,用 char
类型的数组来表示字符串,这是用字符数组的形式来表示的字符串。
字符串的定义及初始化
我们可以使用如下方式来定义一个字符串:
char ch[100];
这个字符串名为 ch
,是一个长度为 100 的字符数组。
我们也可以在定义的时候初始化,初始化的方式有两种。
第一种初始化方式是和其它类型(如int、float)的数组一样的初始化方式:
char ch[5] = { 'a', 'p', 'p', 'l', 'e' };
这样就定义好了一个字符数组,其中:
ch[0]
为 'a';ch[1]
为 'p';ch[2]
为 'p';ch[3]
为 'l';ch[4]
为 'e'。
对于字符数组来说,因为我们在C++中是使用双引号来表示字符串的,所以我们也可以使用如下方式来初始化字符数组:
char ch[5] = "apple";
但是赋值符号((=))只能用于初始化的时候,不能用在初始化以外的地方。
那么如何在初始化以外的地方修改字符串的内容呢?
接下来就到了我们的字符串函数出场的时候了。
要使用字符串函数,我们需要引入字符串函数相关的头文件:#include <cstring>
。
然后我们介绍一下常用的字符串函数:
字符串拷贝函数
strcpy(s, t)
: 该函数用于将字符串 t 的内容赋值给 s 。
示例程序:
#include <iostream>
#include <cstring>
using namespace std;
char a[10], b[10], c[] = "apple";
int main() {
strcpy(a, c);
strcpy(b, "banana");
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
程序输出结果:
a = apple
b = banana
因为我们在初始化的时候开了三个字符数组a、b、c,同时将 c 的内容初始化为"apple",然后使用 strcpy(a, c);
将 c 的内容复制给了 a ;使用 strcpy(b, "banana");
将 "banana" 复制给了 b。
字符串长度函数
strlen(s)
:该函数用于返回字符串的长度。
示例程序:
#include <iostream>
#include <cstring>
using namespace std;
char s[110];
int main() {
cin >> s;
cout << strlen(s) << endl;
return 0;
}
样例输入:
apple
样例输出:
5
字符串比较函数
strcmp(a,b)
:该函数用于比较字符串 s 和 t 的字典序比较结果。
一个字符串的字典序指的是该字符串出现在字典中的顺序,或者我们也可以理解为该字符串出现在字典中的页码。
比如,我们比较两个字符串 "apple" 和 "banana" ,因为 "apple" 出现在字典中的顺序(页码)比 "banana" 要早,所以我们说:"apple" 比 "banana" 的字典序小;"banana" 比 "apple" 的字典序大。
我们再回到 strcmp(a,b)
函数:
- 如果 a 的字典序小于 b ,则
strcmp(a,b)
返回 (-1) ; - 如果 a 和 b 相同,则
strcmp(a,b)
返回 (0) (我们可以通过strcmp(a,b)==0
这个条件来判断他们是否是相同的字符串); - 如果 a 的字典序大于 b ,则
strcmp(a,b)
返回 (1) 。
示例程序:
#include <iostream>
#include <cstring>
using namespace std;
char a[] = "apple", b[] = "banana";
int main() {
cout << strcmp(a, b) << endl;
cout << strcmp(a, a) << endl;
cout << strcmp(b, a) << endl;
return 0;
}
程序输出:
-1
0
1
字符串string
C++的 STL容器 提供给我们很多现成的工具来简化我们的操作,比如其中用来模拟字符串的 string (string就是“字符串”的英文)。
要使用 string ,我们需要包含头文件 #include <string>
。
注意点
我们不包含任何头文件也可以定义字符数组(char ch[110];
)。
但是对于字符数组相关的函数(比如 strcmp
、strlen
、strcpy
等 str
开头的函数),我们在使用之前需要包含头文件 #include <cstring>
,注意这个头文件有一个开头的 c
,用来表示这是从 C 语言里面继承过来的头文件。
而对于 string 来说,不管是定义 string 类型的变量,还是使用 string 的一些方法,我们都需要引入 #include <string>
头文件,注意这个头文件没有开头的 c
。
<cstring>
和 <string>
是不同的头文件,注意区分。
string的定义
我们可以使用如下方式定义一个 string 类型的变量 s:
string s;
也可以在定义的时候初始化:
string s = "apple";
这样就将 s 在定义的时候初始化为了 "apple" 。
string的长度
如果我们定义了一个 string 类型的变量 s ,那么我们可以使用 s.length()
或者 s.size()
方法来获得 s 的长度。这两个函数返回的结果是一样的,即字符串 s 的长度。
示例程序:
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "apple";
cout << s.length() << " , " << s.size() << endl;
return 0;
}
输出结果:
5 , 5
string比较字典序
我们可以使用两种方式来比较 string 的字典序。
方式一 :使用 s.compare(t)
来比较 s 和 t 的字典序。
- 如果 s 的字典序比 t 小,会返回 (-1) ;
- 如果 s 等于 t ,会返回 (0);
- 如果 s 的字典序比 t 大,会返回 (1) 。
示例程序:
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "apple", t = "banana";
cout << s.compare(t) << endl; // 返回-1,因为s的字典序比t小
cout << s.compare(s) << endl; // 返回0,因为s和s相等
cout << t.compare(s) << endl; // 返回1,因为t的字典序比s大
cout << s.compare("abc") << endl; // 返回1,因为s的字典序比"abc"大
return 0;
}
方式二 :我们可以直接使用比较符号(>
、>=
、<
、<=
、==
、!=
)来直接比较两个字符串的字典序。
假设我们定义了两个 string 类型的字符串 s 和 t ( string s, t;
),然后我们可以:
- 使用
s < t
来判断 s 的字典序是否小于 t; - 使用
s <= t
来判断 s 的字典序是否小于或等于 t; - 使用
s > t
来判断 s 的字典序是否大于 t; - 使用
s >= t
来判断 s 的字典序是否大于或等于 t; - 使用
s == t
来判断 s 是否等于 t; - 使用
s != t
来判断 s 是否不等于 t。
示例程序:
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "banana";
if (s < "peach") {
cout << "banana的字典序比peach小" << endl;
}
if (s > "apple") {
cout << "banana的字典序比apple大" << endl;
}
return 0;
}
程序会输出:
banana的字典序比peach小
banana的字典序比apple大
string字符串之间的衔接
我们可以使用 “+” 号来衔接两个 string 类型的字符串。
示例程序:
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "apple", t = "banana";
cout << s + t << endl;
s = s + "HAHA" + s;
cout << s << endl;
return 0;
}
该程序的输出如下:
applebanana
appleHAHAapple
第一次我们输出了 s 和 t 衔接后的结果;
第二次我们首先将 s 变成了 s + "HAHA" + s,然后我们再输出 s。