C++ 中的数组和字符串操作

C++C++Beginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何在 C++ 中操作数组和字符串。实验涵盖了一系列主题,包括创建和初始化一维数组、访问和修改数组元素、实现二维数组、使用 C 风格字符串和 String 类、对数组元素进行排序、执行线性搜索,以及使用 getline() 处理字符串输入。通过这些动手练习,你将对 C++ 编程中的基本数组和字符串操作有深入的理解。

创建和初始化一维数组

在本步骤中,你将学习如何在 C++ 中创建和初始化一维数组。数组是一种基本的数据结构,允许你在连续的内存位置中存储多个相同类型的元素。

打开 WebIDE,在 ~/project 目录下创建一个名为 arrays_intro.cpp 的新文件。我们将探索不同的数组初始化方法。

touch ~/project/arrays_intro.cpp

将以下代码添加到 arrays_intro.cpp 文件中:

#include <iostream>

int main() {
    // 方法 1:声明并初始化一个具有特定大小的数组
    int numbers[5] = {10, 20, 30, 40, 50};

    // 方法 2:让编译器确定数组大小
    int scores[] = {85, 92, 78, 95, 88};

    // 方法 3:用默认值零初始化数组
    int zeros[6] = {0};

    // 方法 4:创建一个数组并在稍后初始化
    int temperatures[4];
    temperatures[0] = 72;
    temperatures[1] = 68;
    temperatures[2] = 75;
    temperatures[3] = 80;

    // 打印数组元素
    std::cout << "第一种方法 - numbers 数组:" << std::endl;
    for (int i = 0; i < 5; i++) {
        std::cout << "元素 " << i << ": " << numbers[i] << std::endl;
    }

    return 0;
}

让我们分解数组的初始化:

  1. int numbers[5] = {10, 20, 30, 40, 50};:显式定义数组大小并初始化所有元素
  2. int scores[] = {85, 92, 78, 95, 88};:让编译器确定数组大小
  3. int zeros[6] = {0};:将所有元素初始化为零
  4. 使用索引手动赋值 temperatures[index] = value

编译并运行程序:

g++ arrays_intro.cpp -o arrays_intro
./arrays_intro

示例输出:

第一种方法 - numbers 数组:
元素 0: 10
元素 1: 20
元素 2: 30
元素 3: 40
元素 4: 50

关于数组的关键点:

  • 数组一旦声明,大小固定
  • 数组索引从 0 开始
  • 你可以通过多种方式初始化数组
  • 始终确保不要超出数组边界

使用索引访问和修改数组元素

在本步骤中,你将学习如何在 C++ 中使用索引访问和修改数组元素。基于上一步的数组初始化内容,我们将探索如何与单个数组元素进行交互。

打开 WebIDE,在 ~/project 目录下创建一个名为 array_indexing.cpp 的新文件:

touch ~/project/array_indexing.cpp

将以下代码添加到 array_indexing.cpp 文件中:

#include <iostream>

int main() {
    // 创建一个学生成绩数组
    int scores[5] = {85, 92, 78, 95, 88};

    // 通过索引访问数组元素
    std::cout << "第一个学生的成绩: " << scores[0] << std::endl;
    std::cout << "第三个学生的成绩: " << scores[2] << std::endl;

    // 修改数组元素
    std::cout << "第二个学生的原始成绩: " << scores[1] << std::endl;
    scores[1] = 96; // 更新第二个学生的成绩
    std::cout << "更新后的第二个学生的成绩: " << scores[1] << std::endl;

    // 计算数组元素的总和
    int total_score = 0;
    for (int i = 0; i < 5; i++) {
        total_score += scores[i];
    }
    std::cout << "班级总成绩: " << total_score << std::endl;

    // 计算平均成绩
    double average_score = static_cast<double>(total_score) / 5;
    std::cout << "班级平均成绩: " << average_score << std::endl;

    return 0;
}

关于数组索引的关键点:

  • 数组索引从 0 开始
  • 使用方括号 [] 访问元素
  • 你可以使用索引读取和修改元素
  • 注意不要访问超出数组范围的索引

编译并运行程序:

g++ array_indexing.cpp -o array_indexing
./array_indexing

示例输出:

第一个学生的成绩: 85
第三个学生的成绩: 78
第二个学生的原始成绩: 92
更新后的第二个学生的成绩: 96
班级总成绩: 442
班级平均成绩: 88.4

重要的索引规则:

  • 第一个元素的索引为 0
  • 最后一个元素的索引为(数组大小 - 1)
  • 访问超出数组范围的索引会导致未定义行为

实现二维数组以表示矩阵

在本步骤中,你将学习如何在 C++ 中创建和操作二维数组。二维数组类似于具有行和列的表格或矩阵,允许你以网格结构存储和操作数据。

打开 WebIDE,在 ~/project 目录下创建一个名为 matrix_arrays.cpp 的新文件:

touch ~/project/matrix_arrays.cpp

将以下代码添加到 matrix_arrays.cpp 文件中:

#include <iostream>

int main() {
    // 方法 1:声明并初始化一个 3x3 矩阵
    int matrix[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    // 方法 2:声明矩阵并在稍后初始化
    int grades[2][4];
    grades[0][0] = 85;
    grades[0][1] = 92;
    grades[0][2] = 78;
    grades[0][3] = 95;
    grades[1][0] = 88;
    grades[1][1] = 90;
    grades[1][2] = 82;
    grades[1][3] = 87;

    // 打印第一个矩阵
    std::cout << "第一个矩阵:" << std::endl;
    for (int row = 0; row < 3; row++) {
        for (int col = 0; col < 3; col++) {
            std::cout << matrix[row][col] << " ";
        }
        std::cout << std::endl;
    }

    // 打印成绩矩阵
    std::cout << "\n成绩矩阵:" << std::endl;
    for (int row = 0; row < 2; row++) {
        for (int col = 0; col < 4; col++) {
            std::cout << grades[row][col] << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

关于二维数组的关键点:

  • 使用两个索引访问元素:array[row][column]
  • 第一个索引表示行,第二个索引表示列
  • 可以通过多种方式初始化
  • 通常使用嵌套循环遍历行和列

编译并运行程序:

g++ matrix_arrays.cpp -o matrix_arrays
./matrix_arrays

示例输出:

第一个矩阵:
1 2 3
4 5 6
7 8 9

成绩矩阵:
85 92 78 95
88 90 82 87

重要的二维数组概念:

  • 数组可以具有超过两个维度
  • 每行可以有不同的列数
  • 始终注意数组边界以避免错误

使用空终止符初始化 C 风格字符串

在本步骤中,你将学习 C 风格字符串以及空终止符在 C++ 中的重要性。C 风格字符串是以特殊字符 '\0' 结尾的字符数组,用于标记字符串的结束。

打开 WebIDE,在 ~/project 目录下创建一个名为 c_style_strings.cpp 的新文件:

touch ~/project/c_style_strings.cpp

将以下代码添加到 c_style_strings.cpp 文件中:

#include <iostream>
#include <cstring>

int main() {
    // 方法 1:显式使用空终止符初始化字符串
    char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
    std::cout << "问候语: " << greeting << std::endl;

    // 方法 2:以字符串字面量初始化(自动添加空终止符)
    char name[] = "John Doe";
    std::cout << "姓名: " << name << std::endl;

    // 方法 3:声明固定大小并初始化
    char message[20] = "Welcome to C++!";
    std::cout << "消息: " << message << std::endl;

    // 演示字符串长度
    std::cout << "姓名的长度: " << strlen(name) << std::endl;

    // 手动计算字符串长度
    int length = 0;
    while (name[length] != '\0') {
        length++;
    }
    std::cout << "手动计算的姓名长度: " << length << std::endl;

    return 0;
}

关于 C 风格字符串的关键点:

  • 空终止符 '\0' 用于标记字符串的结束
  • 始终为字符串分配一个额外的字符以容纳空终止符
  • 字符串字面量会自动添加空终止符
  • strlen() 函数计算空终止符之前的字符数

编译并运行程序:

g++ c_style_strings.cpp -o c_style_strings
./c_style_strings

示例输出:

问候语: Hello
姓名: John Doe
消息: Welcome to C++!
姓名的长度: 8
手动计算的姓名长度: 8

重要的字符串初始化概念:

  • 空终止符对字符串操作至关重要
  • 始终确保为字符串分配足够的空间以容纳空终止符
  • 注意字符串缓冲区的大小以防止溢出

使用字符串类方法(length、substr、find)

在本步骤中,你将学习 C++ 中强大的字符串类方法,这些方法使字符串操作更加简单和直观。我们将探索 length()substr()find() 等关键方法。

打开 WebIDE,在 ~/project 目录下创建一个名为 string_methods.cpp 的新文件:

touch ~/project/string_methods.cpp

将以下代码添加到 string_methods.cpp 文件中:

#include <iostream>
#include <string>

int main() {
    // 创建一个字符串
    std::string message = "Hello, C++ Programming!";

    // 使用 length() 方法
    std::cout << "字符串长度: " << message.length() << std::endl;

    // 使用 substr() 方法
    std::cout << "前 5 个字符: " << message.substr(0, 5) << std::endl;
    std::cout << "从索引 7 开始的子字符串: " << message.substr(7) << std::endl;

    // 使用 find() 方法
    std::string search_word = "Programming";
    size_t position = message.find(search_word);

    if (position != std::string::npos) {
        std::cout << "'" << search_word << "' 在索引位置: " << position << std::endl;
    } else {
        std::cout << "未找到单词" << std::endl;
    }

    // 额外的 find() 示例
    std::string email = "[email protected]";
    size_t at_symbol = email.find('@');
    size_t dot_symbol = email.find('.');

    std::cout << "用户名: " << email.substr(0, at_symbol) << std::endl;
    std::cout << "域名: " << email.substr(at_symbol + 1, dot_symbol - at_symbol - 1) << std::endl;

    return 0;
}

关于字符串类方法的关键点:

  • length():返回字符串中的字符数
  • substr():提取字符串的一部分
    • 第一个参数是起始索引
    • 第二个参数(可选)是子字符串的长度
  • find():搜索子字符串或字符
    • 返回第一次出现的索引
    • 如果未找到,则返回 std::string::npos

编译并运行程序:

g++ string_methods.cpp -o string_methods
./string_methods

示例输出:

字符串长度: 23
前 5 个字符: Hello
从索引 7 开始的子字符串: C++ Programming!
'Programming' 在索引位置: 11
用户名: user
域名: example

重要的字符串方法概念:

  • 字符串方法提供了强大的文本操作功能
  • 索引从 0 开始
  • 始终检查返回值以处理潜在错误

在 C 风格字符串和 String 类之间转换

在本步骤中,你将学习如何在 C 风格字符串和 C++ 字符串类之间进行转换。这些转换在处理 C++ 中不同的字符串表示形式时非常重要。

打开 WebIDE,在 ~/project 目录下创建一个名为 string_conversion.cpp 的新文件:

touch ~/project/string_conversion.cpp

将以下代码添加到 string_conversion.cpp 文件中:

#include <iostream>
#include <string>
#include <cstring>

int main() {
    // C 风格字符串转换为 C++ 字符串
    const char* c_style_str = "Hello, C++ World!";
    std::string cpp_string(c_style_str);
    std::cout << "C++ 字符串: " << cpp_string << std::endl;

    // C++ 字符串转换为 C 风格字符串
    std::string message = "Converting strings";
    const char* c_str = message.c_str();
    std::cout << "C 风格字符串: " << c_str << std::endl;

    // 使用 strcpy 手动转换
    char buffer[50];
    strcpy(buffer, message.c_str());
    std::cout << "复制到缓冲区: " << buffer << std::endl;

    // 字符串长度比较
    std::cout << "C++ 字符串长度: " << message.length() << std::endl;
    std::cout << "C 风格字符串长度: " << strlen(c_str) << std::endl;

    return 0;
}

关键转换方法:

  • std::string(c_style_str):将 C 风格字符串转换为 C++ 字符串
  • .c_str():将 C++ 字符串转换为 C 风格字符串
  • strcpy():手动将字符串复制到字符数组

编译并运行程序:

g++ string_conversion.cpp -o string_conversion
./string_conversion

示例输出:

C++ 字符串: Hello, C++ World!
C 风格字符串: Converting strings
复制到缓冲区: Converting strings
C++ 字符串长度: 18
C 风格字符串长度: 18

重要的转换概念:

  • 使用 .c_str() 从 C++ 字符串获取 const char*
  • 转换时注意缓冲区大小
  • strlen() 适用于 C 风格字符串
  • .length() 适用于 C++ 字符串

使用冒泡排序对数组元素进行排序

在本步骤中,你将学习如何实现冒泡排序算法来对 C++ 中的数组元素进行排序。冒泡排序是一种简单的排序方法,它反复遍历列表,比较相邻元素,并在顺序错误时交换它们。

打开 WebIDE,在 ~/project 目录下创建一个名为 bubble_sort.cpp 的新文件:

touch ~/project/bubble_sort.cpp

将以下代码添加到 bubble_sort.cpp 文件中:

#include <iostream>

int main() {
    // 初始化一个未排序的数组
    int numbers[5] = {64, 34, 25, 12, 22};
    int size = 5;

    // 打印原始数组
    std::cout << "原始数组: ";
    for (int i = 0; i < size; i++) {
        std::cout << numbers[i] << " ";
    }
    std::cout << std::endl;

    // 冒泡排序实现
    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - i - 1; j++) {
            // 比较相邻元素
            if (numbers[j] > numbers[j + 1]) {
                // 交换元素
                int temp = numbers[j];
                numbers[j] = numbers[j + 1];
                numbers[j + 1] = temp;
            }
        }
    }

    // 打印排序后的数组
    std::cout << "排序后的数组: ";
    for (int i = 0; i < size; i++) {
        std::cout << numbers[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

冒泡排序的关键概念:

  • 比较相邻元素
  • 如果顺序错误则交换元素
  • 重复遍历数组直到排序完成
  • 时间复杂度:O(n²)

编译并运行程序:

g++ bubble_sort.cpp -o bubble_sort
./bubble_sort

示例输出:

原始数组: 64 34 25 12 22
排序后的数组: 12 22 25 34 64

重要的排序注意事项:

  • 冒泡排序简单,但对于大型数组效率较低
  • 适合用于教学目的
  • 实际应用中存在更高效的排序算法

在数组中实现线性搜索

在本步骤中,你将学习如何在 C++ 中实现线性搜索算法。线性搜索是一种简单的方法,通过依次检查数组中的每个元素来查找目标元素,直到找到目标或到达数组末尾。

打开 WebIDE,在 ~/project 目录下创建一个名为 linear_search.cpp 的新文件:

touch ~/project/linear_search.cpp

将以下代码添加到 linear_search.cpp 文件中:

#include <iostream>

int linearSearch(int arr[], int size, int target) {
    // 遍历数组中的每个元素
    for (int i = 0; i < size; i++) {
        // 检查当前元素是否与目标匹配
        if (arr[i] == target) {
            return i;  // 如果找到,返回索引
        }
    }
    return -1;  // 如果未找到目标,返回 -1
}

int main() {
    // 创建一个学生成绩数组
    int scores[] = {85, 92, 78, 95, 88, 76, 90};
    int size = sizeof(scores) / sizeof(scores[0]);

    // 要搜索的目标成绩
    int targetScore = 78;

    // 执行线性搜索
    int result = linearSearch(scores, size, targetScore);

    // 显示搜索结果
    if (result != -1) {
        std::cout << "目标成绩 " << targetScore
                  << " 在索引 " << result << " 处找到" << std::endl;
    } else {
        std::cout << "目标成绩 " << targetScore
                  << " 未在数组中找到" << std::endl;
    }

    // 尝试另一个搜索
    int missingScore = 100;
    result = linearSearch(scores, size, missingScore);

    if (result != -1) {
        std::cout << "成绩 " << missingScore
                  << " 在索引 " << result << " 处找到" << std::endl;
    } else {
        std::cout << "成绩 " << missingScore
                  << " 未在数组中找到" << std::endl;
    }

    return 0;
}

线性搜索的关键概念:

  • 依次检查数组中的每个元素
  • 如果找到目标,则返回其索引
  • 如果目标不在数组中,则返回 -1
  • 时间复杂度:O(n) - 线性时间
  • 简单且适用于未排序的数组

编译并运行程序:

g++ linear_search.cpp -o linear_search
./linear_search

示例输出:

目标成绩 78 在索引 2 处找到
成绩 100 未在数组中找到

重要的搜索注意事项:

  • 线性搜索简单,但对于大型数组效率较低
  • 适用于小型数组或未排序的集合
  • 对于已排序的数组,存在更高效的搜索算法

使用 getline() 处理字符串输入

在本步骤中,你将学习如何使用 getline() 在 C++ 中读取完整的文本输入行。与 cin >> 不同,getline() 可以读取包含空格的字符串,并处理更复杂的输入场景。

打开 WebIDE,在 ~/project 目录下创建一个名为 getline_input.cpp 的新文件:

touch ~/project/getline_input.cpp

将以下代码添加到 getline_input.cpp 文件中:

#include <iostream>
#include <string>

int main() {
    // 声明一个字符串以存储输入
    std::string fullName;
    std::string address;

    // 提示输入全名
    std::cout << "请输入你的全名: ";
    std::getline(std::cin, fullName);

    // 提示输入地址
    std::cout << "请输入你的完整地址: ";
    std::getline(std::cin, address);

    // 显示输入并附加信息
    std::cout << "\n--- 用户信息 ---" << std::endl;
    std::cout << "姓名: " << fullName << std::endl;
    std::cout << "地址: " << address << std::endl;

    // 演示读取多行输入
    std::string multiLineText;
    std::cout << "\n请输入多行描述(按 Ctrl+D 结束):" << std::endl;

    std::string line;
    while (std::getline(std::cin, line)) {
        multiLineText += line + "\n";
    }

    std::cout << "\n你的描述:" << std::endl;
    std::cout << multiLineText;

    return 0;
}

getline() 的关键概念:

  • 读取整行文本,包括空格
  • 语法:std::getline(input_stream, string_variable)
  • 可以读取多行输入
  • 处理包含空格的复杂输入
  • 适用于读取全名、地址等

编译程序:

g++ getline_input.cpp -o getline_input
./getline_input

示例交互:

请输入你的全名: John Michael Smith
请输入你的完整地址: 123 Main Street, Anytown, USA

--- 用户信息 ---
姓名: John Michael Smith
地址: 123 Main Street, Anytown, USA

请输入多行描述(按 Ctrl+D 结束):
这是一个示例
多行描述
包含多行文本。

你的描述:
这是一个示例
多行描述
包含多行文本。

重要的输入处理注意事项:

  • getline() 读取直到换行符
  • 适用于捕获完整的文本输入
  • 可以与其他输入方法结合使用

总结

在本实验中,你将学习如何在 C++ 中创建和初始化一维数组,使用索引访问和修改数组元素,实现二维数组以表示矩阵,使用空终止符初始化 C 风格字符串,使用字符串类方法,在 C 风格字符串和字符串类之间进行转换,使用冒泡排序对数组元素进行排序,在数组中实现线性搜索,以及使用 getline() 处理字符串输入。

你将探索不同的数组初始化方法,包括指定大小并初始化所有元素、让编译器确定大小、将所有元素初始化为零以及使用索引手动赋值。你还将学习如何使用索引访问和修改数组元素,以及如何处理数组边界以避免错误。此外,你将使用二维数组、C 风格字符串和字符串类,学习如何在它们之间进行转换并执行各种操作。

您可能感兴趣的其他 C++ 教程