跳至正文
View Categories

4 min read

字符串概述 #

我们之前讲解了 字符类型 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;
}

还有一些其他方法,我们将在后续的课程中介绍。

习题 #

字符串的反码

字符串加密

字符串对比

字符串中的空格移位