往期回顾:
C++ 入门01:初识 C++-CSDN博客
C++ 入门02:控制结构和循环-CSDN博客
C++ 入门03:函数与作用域-CSDN博客
一、前言
在前面文章的学习中,我们大概了解了C++基础,包括C++的基本结构、变量的概念、输入输出操作、控制结构、函数与作用域等。
今天,我们将在此基础上进一步学习数组与字符串这两大核心数据结构。数组作为一组具有相同类型的变量的集合,是处理一组数据(如学生成绩、商品信息等)时不可或缺的工具。通过数组,我们可以更加便捷地对多个相关数据进行操作和管理。
而字符串则是文本处理的基石。在C++中,字符串可以通过字符数组或标准库中的string
类来表示。我们将学习如何创建和修改字符串,如何进行字符串的连接、比较和查找等操作,以及如何利用字符串处理函数来实现复杂的文本处理任务。这些技能对于开发需要处理用户输入、输出日志、进行文本分析等功能的程序至关重要。
二、数组与字符串
2.1、 数组
数组是一种基本而强大的数据结构,在包括C++在内的多种编程语言中都扮演着核心角色。数组用于在内存中连续存储一组相同类型的数据元素。这种连续存储的特性使得数组在访问元素时非常高效,因为可以通过简单的数学计算(通常是索引乘以元素大小)来直接定位到任何元素的内存地址。
(1)数组特性
相同类型: |
数组中的所有元素都是同一类型,这保证了内存的一致性和操作的简便性。 |
连续存储: | 数组元素在内存中是连续存放的,这使得通过索引快速访问数组中的任意元素成为可能。索引通常是从0开始的。 |
固定大小: | 在大多数编程语言中,数组的大小在创建时就被确定,并且在整个生命周期中保持不变(尽管有些语言提供了动态数组或向量等结构来模拟可变大小的数组)。 |
随机访问: | 由于数组在内存中是连续存储的,因此可以通过索引直接访问数组中的任何元素,这种访问方式被称为随机访问。 |
(2)数组声明与初始化
数组的声明是一个明确的过程,它要求程序员指定数组将要存储的数据类型以及数组能够容纳的元素数量(即数组的大小)。这种明确性有助于编译器为数组分配适当的内存空间,并确保对数组的操作是类型安全的。
语法:
数据类型 数组名[数组大小];
数据类型: |
指定了数组中每个元素的数据类型。这决定了数组可以存储什么类型的数据,比如int 、float 、char 等。 |
数组名: | 是程序员为数组指定的唯一标识符,用于在程序中引用数组。 |
数组大小: | 是一个整数常量表达式,指定了数组中元素的数量。这个大小在数组声明时确定,并且在数组的整个生命周期内保持不变。 |
初始化:
在C++中,数组可以在声明的同时进行初始化。初始化是设置数组元素初始值的过程。当数组被初始化时,编译器会自动为数组的每个元素分配初始值,这些值可以是程序员指定的,也可以是编译器默认提供的(对于未明确初始化的元素)。
示例:
#include <iostream>
using namespace std;
int main() {
// 声明并初始化一个整型数组
int numbers[5] = {1, 2, 3, 4, 5};
// 访问并打印数组中的元素
for(int i = 0; i < 5; i++) {
cout << numbers[i] << " ";
}
// 声明并部分初始化一个字符数组,未初始化的元素将被自动初始化为'\0'(在某些情况下)
char letters[10] = {'a', 'b', 'c'}; // 注意:这里只初始化了前三个元素
// 访问并打印字符数组中的元素(仅打印已初始化的部分)
for(int i = 0; i < 3; i++) { // 注意:这里只循环到3,因为只初始化了三个元素
cout << letters[i] << " ";
}
return 0;
}
在上面的例子中,numbers
数组是一个整型数组,它被声明为包含5个元素,并在声明时通过花括号内的列表初始化为1到5。letters
数组是一个字符数组,它被声明为包含10个元素,但只显式地初始化了前三个元素为'a'、'b'和'c'。
对于letters
数组中未显式初始化的元素,它们的值将是未定义的(但在某些情况下,如作为字符串使用时,数组的第一个未初始化元素之后的元素可能会被自动初始化为'\0'字符,以标记字符串的结束)。然而,这种自动初始化为'\0'的行为并不是所有情况下都会发生的,特别是在非字符串上下文中。因此,最好总是显式地初始化数组的所有元素,以避免潜在的未定义行为。
(3)访问数组元素
数组元素通过索引访问,索引从 0 开始。
示例:
#include <iostream>
int main() {
int scores[5] = {90, 85, 80, 75, 70};
for (int i = 0; i < 5; i++) {
std::cout << "Score " << i + 1 << ": " << scores[i] << std::endl;
}
return 0;
}
(4)修改数组元素
可以通过索引修改数组元素的值。
示例:
#include <iostream>
int main() {
int scores[5] = {90, 85, 80, 75, 70};
scores[2] = 95; // 修改第三个元素的值
std::cout << "Updated third score: " << scores[2] << std::endl;
return 0;
}
(5)多维数组
多维数组是数组的数组,最常见的是二维数组。
语法:
type arrayName[size1][size2];
type arrayName[size1][size2] = {{value11, value12, ...}, {value21, value22, ...}, ...};
示例:
#include <iostream>
int main() {
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
std::cout << matrix[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}
2.2、 字符串
字符串在C++中是由一系列字符组成的序列,这些字符可以是字母、数字、标点符号等。C++提供了多种方式来处理字符串,其中最常见的是使用字符数组(C风格字符串)和std::string
类(C++标准库中的字符串类)。
(1)字符数组(C风格字符串)
字符数组是C++中处理字符串的传统方式,它实际上是一个字符类型的数组,以空字符('\0'
)作为字符串的结束标志。这种字符串通常被称为C风格字符串。
A、声明和初始化:
char str[] = "Hello, World!"; // 字符数组,包含13个字符加上一个空字符'\0'作为结束
注意事项:
- C风格字符串必须以空字符结束。
- 访问字符串时需要注意不要越界。
- 字符串的长度(不包括结束符)可以使用标准库函数
strlen
来获取。 - 字符串的复制、连接等操作需要手动管理内存,容易出错。
(2)std::string
为了简化字符串的处理,C++标准库提供了std::string
类。std::string
是一个模板类,专门用于处理字符串,它提供了丰富的成员函数来执行各种字符串操作。
声明和初始化:
#include <string>
std::string str = "Hello, World!"; // 使用std::string类声明并初始化字符串
优点:
- 自动管理内存,无需担心内存泄漏或越界问题。
- 提供了丰富的成员函数,如
length()
、size()
(两者等价,返回字符串长度,不包括结束符)、append()
、substr()
等,方便进行字符串操作。 - 支持字符串与C风格字符串之间的转换(通过
c_str()
成员函数可以将std::string
转换为C风格字符串)。
示例:
#include <iostream>
#include <string>
int main() {
std::string str = "Hello, ";
str += "World!"; // 使用+=操作符连接字符串
std::cout << str << std::endl; // 输出: Hello, World!
std::cout << "Length: " << str.length() << std::endl; // 输出字符串长度
return 0;
}
在现代C++编程中,推荐使用std::string
来处理字符串,因为它更加安全、方便和灵活。然而,在某些需要与C语言代码互操作或优化内存使用的场景下,仍然需要使用字符数组(C风格字符串)。
(3)常用字符串操作
A、获取字符串长度
std::string
提供 length()
和 size()
方法来获取字符串长度。
示例:
#include <iostream>
#include <string>
int main() {
std::string greeting = "Hello, World!";
std::cout << "Length of greeting: " << greeting.length() << std::endl;
return 0;
}
B、连接字符串
可以使用 +
运算符或 append()
方法来连接字符串。
示例:
#include <iostream>
#include <string>
int main() {
std::string firstName = "John";
std::string lastName = "Doe";
std::string fullName = firstName + " " + lastName;
std::cout << "Full name: " << fullName << std::endl;
return 0;
}
C、访问字符串字符
可以使用索引访问和修改字符串中的字符。
示例:
#include <iostream>
#include <string>
int main() {
std::string greeting = "Hello";
std::cout << "First character: " << greeting[0] << std::endl;
greeting[0] = 'J';
std::cout << "Modified greeting: " << greeting << std::endl;
return 0;
}
以上就是 C++ 程序的数组与字符串的基本用法的知识点了。数组帮助我们存储和管理一组数据,而字符串是处理文本的重要工具。掌握这些内容可以大大提高我们处理数据的能力。
都看到这里了,点个赞再走呗朋友~
加油吧,预祝大家变得更强!