C++ 字符串
字符串就是由多个字符组成的一串,就像英文由 26 个字母组成的是一个道理
比如由 H
,e
,l
,l
,o
,\0
可以组成一个字符串 Hello
,那最后那个 \0
是什么意思呢?
\0
其实就是 NULL
,表示的是一个字符串的结束,就像换行符用来表示一个段落的结束是同样的道理
字符数组
既然字符串是由多个字符组成的串,那么我们首先想到的应该是,字符串是一个字符数组,比如这样
char hello[] = {'H','e','l','l','o','\0'};
比如我们使用 std::cout
输出字符数组 hello
就会得到如下值
/** * file: main.cpp * author: 简单教程(www.twle.cn) * * Copyright © 2015-2065 www.twle.cn. All rights reserved. */ #include <iostream> int main () { char hello[] = {'H','e','l','l','o','\0'}; std::cout << hello << std::endl; char world[] = {'W','o','r','l','d','\0','H','i','\0'}; std::cout << world << std::endl; return 0; }
编译运行上面的代码,输出结果如下
Hello World
你可能会问,最后那个 \0
怎么没输出,还有 Hi
怎么也没有输出
上面我们说到,\0
是表示字符串结束,它不是字符串的组成部分
std::cout
在输出字符数组的时候,它会把数组当作字符串来处理,遇到 \0
就表示字符串结束了,所以 Hi
就被抛弃了
字符数组的内存布局
下面的声明和初始化创建了一个 "Hello" 字符串
char hello[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
由于在数组的末尾存储了空字符,所以字符数组的大小比单词 "Hello" 的字符数多一个
那 greeting
字符串在内存中是如何表示的呢? 先来看看这张图
依据数组初始化规则,可以把上面的语句写成以下语句
char greeting[] = "Hello";
为什么末尾没有 \0
其实,不需要把 NULL
(\0
) 字符放在字符串常量的末尾, C++ 编译器会在初始化数组时,自动把 \0
放在字符串的末尾
操作字符数组的函数
C++ 在头文件 <cstring>
中包含了大量的的函数用来操作以 \0
结尾的字符数组 (字符串)
函数 | 说明 |
---|---|
strcpy(s1, s2) | 复制字符串 s2 到字符串 s1 |
strcat(s1, s2) | 连接字符串 s2 到字符串 s1 的末尾 |
strlen(s1) | 返回字符串 s1 的长度 |
strcmp(s1, s2) | 如果 s1 和 s2 是相同的,则返回 0;如果 s1 |
strchr(s1, ch) | 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置 |
strstr(s1, s2) | 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置 |
我们写一个范例来演示下这些函数的使用
/** * file: main.cpp * author: 简单教程(www.twle.cn) * * Copyright © 2015-2065 www.twle.cn. All rights reserved. */ #include <iostream> #include <cstring> int main () { char str1[11] = "Hello"; char str2[11] = "World"; char str3[11]; int len ; // 复制 str1 到 str3 strcpy( str3, str1); std::cout << "strcpy( str3, str1) : " << str3 << std::endl; // 连接 str1 和 str2 strcat( str1, str2); std::cout << "strcat( str1, str2): " << str1 << std::endl; // 连接后,str1 的总长度 len = strlen(str1); std::cout << "strlen(str1) : " << len << std::endl; return 0; }
编译和运行以上范例,输出结果如下
strcpy( str3, str1) : Hello strcat( str1, str2): HelloWorld strlen(str1) : 10
C++ std::string 类
我们日常处理和交流使用的都是字符串而不是字符,所以 C++
通过标准库的形式专门提供了一个字符串类型 std::string
头文件
使用 C++ 提供的 std::string
类型需要包含头文件 <string>
#include <string>
如果想去掉命名空间前缀 std::
,则可以加上 using namespace std;
#include <string> using namespace std;
创建 string 变量
std::string
类型的使用和其它基本类型,比如 int
,short
一样
比如说声明一个字符串变量的形式如下
string hello = "Hello";
string 操作符
还可以对字符串使用加法(+)运算符,那么就是拼接两个字符串成一个字符串
string hello = "Hello"; string world = "World"; string hello_world = hello + world; // 得到 "HelloWorld"; string hello_world2 = hello + " " + world; // // 得到 "Hello World";
我们写一个例子来演示下 string
/** * file: main.cpp * author: 简单教程(www.twle.cn) * * Copyright © 2015-2065 www.twle.cn. All rights reserved. */ #include <iostream> #include <string> int main () { std::string str1 = "Hello"; std::string str2 = "World"; std::string str3; int len ; // 复制 str1 到 str3 str3 = str1; std::cout << "str3 : " << str3 << std::endl; // 连接 str1 和 str2 str3 = str1 + str2; std::cout << "str1 + str2 : " << str3 << std::endl; // 连接后,str3 的总长度 len = str3.size(); std::cout << "str3.size() : " << len << std::endl; return 0; }
编译和运行以上范例,输出结果如下
str3 : Hello str1 + str2 : HelloWorld str3.size() : 10