跳到主要内容

C++ 数组与字符串

引言

在C++编程中,数组和字符串是两个基础且重要的概念。数组允许我们在连续的内存位置存储同类型的多个元素,而字符串则是一种特殊的字符数组,用于存储文本数据。本文将详细介绍C++中数组和字符串的概念、操作和实际应用,帮助初学者掌握这两个重要的数据结构。

数组基础

什么是数组?

数组是一种数据结构,用于存储同一类型的多个元素。数组中的元素在内存中是连续存储的,每个元素都可以通过索引进行访问。

数组的声明和初始化

在C++中,数组可以通过以下方式声明和初始化:

cpp
// 声明一个包含5个整数的数组
int numbers[5];

// 声明并初始化一个数组
int numbers[5] = {1, 2, 3, 4, 5};

// 省略数组大小,编译器会根据初始化的元素个数确定大小
int numbers[] = {1, 2, 3, 4, 5};

// 部分初始化,未指定的元素将被初始化为0
int numbers[5] = {1, 2}; // 等价于 {1, 2, 0, 0, 0}

访问数组元素

数组元素通过索引访问,索引从0开始:

cpp
int numbers[] = {10, 20, 30, 40, 50};
cout << "第一个元素: " << numbers[0] << endl; // 输出: 10
cout << "第三个元素: " << numbers[2] << endl; // 输出: 30

多维数组

C++支持多维数组,最常见的是二维数组:

cpp
// 声明一个3行4列的二维数组
int matrix[3][4];

// 初始化二维数组
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};

// 访问二维数组的元素
cout << "matrix[1][2] = " << matrix[1][2] << endl; // 输出: 7

字符串

C风格字符串

在C++中,字符串可以表示为字符数组。C风格字符串是以空字符('\0')结尾的字符数组。

cpp
// 声明并初始化一个C风格字符串
char greeting[] = "Hello"; // 实际上是 {'H', 'e', 'l', 'l', 'o', '\0'}

// 手动指定每个字符
char greeting[] = {'H', 'e', 'l', 'l', 'o', '\0'};

// 输出字符串
cout << greeting << endl; // 输出: Hello
警告

C风格字符串必须以'\0'(空字符)结尾,否则C++无法确定字符串的结束位置,可能导致意外行为。

C++ string类

C++标准库提供了string类,它比C风格字符串更安全、更方便:

cpp
#include <string>
using namespace std;

// 声明并初始化一个string对象
string greeting = "Hello";

// 连接字符串
greeting += " World";
cout << greeting << endl; // 输出: Hello World

// 获取字符串长度
cout << "Length: " << greeting.length() << endl; // 输出: Length: 11

// 访问单个字符
cout << "First character: " << greeting[0] << endl; // 输出: First character: H

string类的常用函数

string类提供了许多有用的操作:

cpp
string s = "Hello World";

// 子字符串
string sub = s.substr(0, 5); // "Hello"

// 查找
int pos = s.find("World"); // 返回6

// 替换
s.replace(0, 5, "Hi"); // "Hi World"

// 插入
s.insert(3, "!!!"); // "Hi!!!World"

// 删除
s.erase(3, 3); // "Hi World"

数组与字符串的关系

字符串本质上是字符数组,但C++的string类提供了更多功能和安全保障。以下是它们之间的关系和区别:

cpp
// 字符数组(C风格字符串)
char cstr[] = "Hello";

// C++风格字符串
string cppstr = "Hello";

// 转换:C++ string转C风格字符串
const char* c_str = cppstr.c_str();

// 转换:C风格字符串转C++ string
string new_str(cstr);

实际应用案例

案例1:单词计数器

以下代码使用C++的字符串操作来统计一段文本中的单词数:

cpp
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main() {
string text = "C++ is a powerful programming language";
stringstream ss(text);
string word;
int count = 0;

while (ss >> word) {
count++;
}

cout << "单词数量:" << count << endl; // 输出: 单词数量:6
return 0;
}

案例2:简单的学生成绩管理

使用数组来存储和计算学生成绩:

cpp
#include <iostream>
using namespace std;

int main() {
const int NUM_STUDENTS = 5;
string names[NUM_STUDENTS] = {"张三", "李四", "王五", "赵六", "钱七"};
double scores[NUM_STUDENTS] = {85.5, 92.0, 78.5, 90.0, 88.5};

// 计算平均分
double sum = 0;
for (int i = 0; i < NUM_STUDENTS; i++) {
sum += scores[i];
}
double average = sum / NUM_STUDENTS;

// 找出最高分
double highest = scores[0];
int highestIndex = 0;
for (int i = 1; i < NUM_STUDENTS; i++) {
if (scores[i] > highest) {
highest = scores[i];
highestIndex = i;
}
}

cout << "平均分: " << average << endl;
cout << "最高分: " << highest << " (学生: " << names[highestIndex] << ")" << endl;

return 0;
}

输出结果:

平均分: 86.9
最高分: 92 (学生: 李四)

常见问题和注意事项

数组边界

C++不会自动检查数组边界,越界访问会导致未定义行为:

cpp
int numbers[5] = {1, 2, 3, 4, 5};
cout << numbers[5] << endl; // 错误!越界访问
注意

数组越界访问是一个常见的编程错误,可能导致程序崩溃或产生不可预测的行为。

字符串比较

比较C风格字符串时不能使用==运算符,而应使用strcmp函数:

cpp
#include <cstring>

char str1[] = "Hello";
char str2[] = "Hello";

// 错误的比较方式
if (str1 == str2) { // 这比较的是地址,不是内容
cout << "相等" << endl;
}

// 正确的比较方式
if (strcmp(str1, str2) == 0) {
cout << "相等" << endl;
}

而对于string类,可以直接使用==运算符:

cpp
string s1 = "Hello";
string s2 = "Hello";

if (s1 == s2) {
cout << "相等" << endl;
}

总结

本文详细介绍了C++中数组和字符串的基本概念、声明方式、操作方法以及它们之间的关系。对于初学者来说,理解这些概念对于掌握C++编程至关重要:

  1. 数组是存储同类型元素的连续内存块,通过索引访问。
  2. C风格字符串是以空字符结尾的字符数组。
  3. C++ string类提供了更方便、更安全的字符串处理方式。
  4. 在实际应用中,数组和字符串常常一起使用,解决各种问题。

练习题

  1. 编写一个程序,接受用户输入的5个整数,存入数组,然后计算它们的平均值。
  2. 编写一个程序,检查用户输入的字符串是否为回文(从前往后和从后往前读都一样)。
  3. 编写一个程序,将两个字符串连接起来,但不使用+运算符或append()函数。
  4. 实现一个简单的通讯录系统,使用数组存储联系人的名字和电话号码。

进一步学习资源

  • 《C++ Primer》 - Stanley B. Lippman等著
  • cplusplus.com - C++参考资料
  • LearnCpp.com - 在线C++教程
  • C++标准库的<array><string>文档

通过掌握数组和字符串这两个基础概念,你将能够更加自信地探索C++编程的更多内容。