字符串概述 #
我们之前讲解了 字符类型 char ,并且介绍了字符在 C++ 中的表示。
// 以下都是字符 char D = 'A'; char A = 'a'; char S = '0'; char H = '.'; char I = '+'; char M = '*';
根据我们的生活经验,除了使用一个字符以外,我们经常将字符连接起来使用,比如
// 以下每一行,都是一个“将字符连接起来”的示例 apple Hello World! 4 * 8 = 64 / 2.0;
在 C++ 中,我们将这样的表达,称为 “字符串”。
“字符”和“字符串”的关系,如下图所示:
字符串语法 #
字符串表示 #
在 C++ 中,字符串这样表示:
// 以下都是字符串 char da [] = "apple"; char shi[] = "Hello World!"; char ma [] = "4 * 8 = 64 / 2.0;"; char dashima[] = "A";
由什么值得注意的吗?
- 字符串,使用双引号(”)包围。
- 字符串,可以有空格。
- 所有的 ASCII 中的字符,都可以组成字符串。
- 字符串,也可以只由一个字符组成。
- 字符串,变量的声明语法,和一般的变量不同。
下面,就字符串变量的声明,做详细说明。
字符串变量的声明语法 #
语法结构:
char 变量名 [] = "字符串";
和之前的变量声明相比,这里增加了一个中括号([])。请特别注意。
由于,“字符串”其实是由“字符”组成的,所以,声明中也体现了他们之间的联系。
字符串是使用 char 来作为基础的。
在编程中,大家应该将字符串看作一张表格。这样是非常有用的。
下面,讲解一下这个表格有什么作用。
字符串索引 #
对于一个表格来说,最重要的,就是怎么知道表格中的值。
字符串,可以看作一个表格,所以,应该如何获得字符串中的数据呢?
索引读取 #
请补全,并运行代码
char str[] = "apple"; std::cout << str[3] << std::endl;
请注意,输出的字符是哪一个,是 p 还是 l ?
对一个字符串变量,可以使用中括号+数字,来读取里面的内容。
要特别注意的是,数字代表的意义是表格的索引号
- 索引号,从 0 开始。
索引写入 #
请补全,并运行代码
char str[] = "apple"; str[3] = 'L'; // 修改字符串中的值。注意,'L'是一个字符 std::cout << str << std::endl; // 输出字符串
- 字符串中,每一个元素,都是一个字符。
输出字符串 #
直接输出 #
定义完一个字符串后,可以直接通过std::cout进行输出
char str[] = "apple"; std::cout << str << std::endl; // 输出字符串
循环输出 #
小练习:
请定义一个字符串 “Hello Dashima!”,然后分别使用 while 和 for,输出字符串。
这个字符串的长度为 14
示例代码:
#include < iostream > using namespace std; int main() { char dashima[] = "Hello Dashima!"; // while int i(0); cout << "Using while: " << endl; while (i < 14) cout << dashima[i++]; cout << endl << endl; // for 1 cout << "Using for 1: " << endl; for (int j = 0; j < 14; j++) cout << dashima[j]; cout << endl << endl; // for 2 cout << "Using for 2: " << endl; for (int j = 0; j < 14; ) cout << dashima[j++]; cout << endl << endl; return 0; }
上面的代码,使用了一个关键的前提条件,就是字符串的长度是 14 。而这是可以从题目中得到的。
字符串的长度 #
下面,假如我们不能够直接使用“字符串的长度为 15 ”这个条件,要怎么做呢?
当然,首要问题就是,我们怎么从字符串本身,推导出来字符串的长度?请试一试。
提示:sizeof()
#include < iostream > using namespace std; int main() { char dashima[] = "Hello Dashima!"; int size = /* 请补全代码 */; cout << "size is " << size << endl; return 0; }
示例代码:
#include < iostream > using namespace std; int main() { char dashima[] = "Hello Dashima!"; int size = sizeof(dashima) / sizeof(dashima[0]) - 1; cout << "size is " << size << endl; return 0; }
说明:
下面的是字符串“Hello Dashima!”的表格形式,这里第五位的 32 是空格的十进制 ACSII 码值。
// 表示的是一个字符的大小 sizeof(dashima[0]); // 相当于 sizeof('H'); // 相当于 sizeof(char);
求得一个字符的大小后,再来求一下字符串的总体大小。
// 表示的是字符串的总体大小 sizeof(dashima);
那么,两者相除,自然就可以得到字符串的长度。所以
// 字符串中的元素数量 int size = sizeof(dashima) / sizeof(dashima[0]) - 1;
为什么还需要减一呢?因为真实情况的字符串样子,是这样的:
最后一位,存在一个(/0)。注意
- C++ 中,每个字符串的的结尾,必须包含一个(/0)。
这个(/0)也是一个十进制 ACSII 码值,它是ASCII表的第一个字符,表示空。
下面再给出 ASCII 表,方便大家查找。
最后,请试一下,用新学习的方法,改写 2.循环输出 中的代码。
完成后,请参考下面代码。
使用 while #
#include < iostream > using namespace std; int main() { char dashima[] = "Hello Dashima!"; int size = sizeof(dashima) / sizeof(dashima[0]) - 1; // while int i(0); cout << "Using while: " << endl; while (i < size) cout << dashima[i++]; return 0; }
使用 for #
#include < iostream > using namespace std; int main() { char dashima[] = "Hello Dashima!"; int size = sizeof(dashima) / sizeof(dashima[0]) - 1; // for 1 cout << "Using for 1: " << endl; for (int j = 0; j < size; j++) cout << dashima[j]; cout << endl << endl; // for 2 cout << "Using for 2: " << endl; for (int j = 0; j < size; ) cout << dashima[j++]; cout << endl << endl; return 0; }
输入字符串 #
字符串的输入,也可以使用 cin,但是有一些不同。
请看下面的例子:
#include < iostream > int main() { char str[100] = ""; // 注意这一行 std::cin >> str; std::cout << str << std::endl; return 0; }
运行时,请输入”Apple”,然后回车。
cin 和 cout 这两个用法,均和之前的用法没什么差异。
但是,我们看到 str 的声明中,中括号中出现了数字。这是什么意义呢?
申请一定大小的字符串 #
大家看到这样的标题一定很奇怪,我们先来解释:什么是“申请”。
“申请”是编程中的术语,指的是:让计算机预留一定大小的内存,给声明的字符串。
上面代码中的数值 100 ,就是指:预留内存的大小,应该正好可以存放长度为 100 字符串(也就是含有 100 个字符的字符串)。
这么做的原因是,计算机在接受输入字符串的前,需要先声明一个足够大的字符串,以便于后续存放。
为了加深理解,我们来思考几个场景:
- 假如我们输入的字符串很短,比如(“Hello”)
这时候,我们不需要声明长度为 100 的字符串 str。长度为 6 就够了。(注意字符串的“尾后 \0”)
- 假如我们输入的字符串很长,比如长度为 200
这时候,如果我们声明的 str 长度只有 100,自然长度为 200 的字符串,是不可以存放到长度为 100 的 str 中的。
程序就会报错。
- 所以,一般我们要综合考虑,设置一个合适的预留大小。
处理输入带有空格的情况 #
还是运行上面的例程,这时候请输入”Hello World”,然后回车。
看到的输出,应该为
Hello
空格,以及空格后的“World”都不见。注意:
- 使用 cin 输入字符串时,不能有空格
接受带空格的字符串输入,需要使用其他方法。
思考:如果要读取输入”Hello World”,可以怎么做?请编程,读取字符串后,并输出。
/* 请完成后,查看示例程序 */
示例程序:
#include < iostream > int main() { char str1[100] = ""; // 注意这一行 char str2[100] = ""; // 注意这一行 std::cin >> str1; std::cin >> str2; std::cout << str1 << " " << str2 << std::endl; return 0; }
还有一些其他方法,我们将在后续的课程中介绍。