【入门级-C++程序设计:8、字符串的处理-字符数组与相关函数&string类与相关函数】

一、字符数组与相关函数
字符数组是 C++ 中用于存储字符串的基本数据结构,本质上是 char 类型的数组,以 \0(空字符)结尾。
1、字符数组的定义、初始化、操作及相关函数的详细说明。
char str1[10]; // 定义一个长度为 10 的字符数组(未初始化)
char str2[] = “Hello”; // 自动计算长度(包含 ‘\0’,实际长度为 6)
// 等价于 char str2[6] = {‘H’,‘e’,‘l’,‘l’,‘o’,‘\0’};
char str3[6] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’}; // 逐个字符初始化
注意事项:
字符数组必须以 \0 结尾,否则某些字符串函数(如 strlen、strcpy)会出现未定义行为。
数组长度必须至少比字符串长度大 1(用于存储 \0)。
数组中每一个元素实际存储的是每个字符的ASCII 码

2、字符数组的输入/输出
(1) 输入 cin / gets(不推荐)
char name[50];
cin >> name; // 遇到空格停止(不安全,可能缓冲区溢出)
cin.getline(name, 50); // 安全输入一行(最多 49 字符 + ‘\0’)
(2) 输出 cout / printf
char str[] = “Hello”;
cout << str; // C++ 风格
printf(“%s”, str); // C 风格

3、常用字符串操作函数
需包含头文件 (C++)或 <string.h>(C)。
(1) 字符串长度 strlen
const char* str = “Hello”;
size_t len = strlen(str); // 返回 5(不包含 ‘\0’)
(2) 字符串复制 strcpy / strncpy
char dest[10];
const char* src = “World”;
strcpy(dest, src); // 复制 src 到 dest(需确保 dest 空间足够)
strncpy(dest, src, 3); // 安全复制,最多复制 3 个字符(不会自动补 ‘\0’)
(3) 字符串连接 strcat / strncat
char str[20] = “Hello”;
strcat(str, " World"); // 连接后 str = “Hello World”
strncat(str, “!!!”, 2); // 安全连接,最多添加 2 个字符(自动补 ‘\0’)
(4) 字符串比较 strcmp / strncmp
const char* s1 = “apple”;
const char* s2 = “banana”;
int result = strcmp(s1, s2); // 返回负数(s1 < s2)、0(相等)、正数(s1 > s2)
int result2 = strncmp(s1, s2, 3); // 只比较前 3 个字符
(5) 字符串查找 strchr / strstr
const char* str = “Hello World”;
char* p = strchr(str, ‘o’); // 查找字符 ‘o’ 首次出现的位置(返回指针)
char* p2 = strstr(str, “World”); // 查找子串 “World”(返回起始地址)

二、string类与相关函数
std::string 是 C++ 标准库提供的字符串类,封装了动态字符数组的操作,比 C 风格字符串(char[])更安全、更易用。

  1. 基本用法
    (1) 头文件
    #include // 必须包含
    using namespace std; // 或者使用 std::string

(2) 创建 string 对象
string s1; // 空字符串
string s2(“Hello”); // 用C风格字符串初始化
string s3 = “World”; // 同上
string s4(s2); // 拷贝构造
string s5(5, ‘A’); // 5个’A’字符组成的字符串 “AAAAA”

(3) 常用成员函数
容量相关
s.size() / s.length(); // 返回字符串长度
s.empty(); // 判断是否为空
s.capacity(); // 返回当前分配的存储容量
s.reserve(n); // 预分配存储空间
元素访问
cpp
s[0]; // 访问第一个字符(不检查边界)
s.at(0); // 访问第一个字符(会检查边界)
s.front(); // 第一个字符
s.back(); // 最后一个字符

修改操作
s += “abc”; // 追加字符串
s.append(“abc”); // 追加字符串
s.push_back(‘a’); // 追加单个字符
s.insert(pos, “abc”); // 在pos位置插入
s.erase(pos, len); // 删除从pos开始的len个字符
s.replace(pos, len, str); // 替换部分内容
s.clear(); // 清空字符串

字符串操作
s.substr(pos, len); // 获取子串
s.compare(str); // 比较字符串
s.find(“abc”); // 查找子串,返回位置或string::npos
s.rfind(“abc”); // 反向查找
s.find_first_of(“abc”); // 查找任意给定字符首次出现
s.find_last_of(“abc”); // 查找任意给定字符最后出现
s.c_str(); // 返回C风格字符串(const char*)
s.data(); // 返回字符数组(不保证以null结尾)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

papership

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值