ICPC笔记
String
String 陌生用法 1. 截取子串 (Substrings) 方法名 功能说明 核心代码示例 substr(pos, len) 从索引 pos 开始,截取长度为 len 的子串。 string s = "Hello C++"; string sub = s.substr(6, 3); // 结果...
String
陌生用法
1. 截取子串 (Substrings)
| 方法名 | 功能说明 | 核心代码示例 |
|---|---|---|
substr(pos, len) | 从索引 pos 开始,截取长度为 len 的子串。 | string s = "Hello C++"; string sub = s.substr(6, 3); // 结果为 "C++" |
substr(pos) | 省略长度参数时,默认从索引 pos 一直截取到字符串末尾。 | string s = "Hello C++"; string sub = s.substr(6); // 结果为 "C++" |
2. 查找 (Searching)
用于定位特定字符或子串在主串中的位置。特别注意:找不到时会返回 string::npos。
| 方法名 | 功能说明 | 核心代码示例 |
|---|---|---|
find(str) | 从左向右查找 str,返回它第一次出现的首字符索引。 | string s = "abc abc"; size_t p = s.find("abc"); // 结果为 0 |
rfind(str) | 从右向左查找 str,返回它最后一次出现的首字符索引。 | string s = "abc abc"; size_t p = s.rfind("abc"); // 结果为 4 |
find_first_of(str) | 查找 str 中的任意一个字符首次出现的位置。 | string s = "hello"; size_t p = s.find_first_of("aeiou"); // 找元音,返回 1 ('e') |
3. 增删改 (Modifying)
直接对原字符串的内容进行结构性的修改。
| 操作类别 | 方法名 | 功能说明 | 核心代码示例 |
|---|---|---|---|
| 增 (Insert) | insert(pos, str) | 在指定的索引 pos 之前插入完整的字符串 str。 | string s = "Heo"; s.insert(2, "ll"); // 结果变为 "Hello" |
| 删 (Erase) | erase(pos, len) | 从指定的索引 pos 开始,删除连续的 len 个字符。 | string s = "Hello World"; s.erase(5, 6); // 结果变为 "Hello" |
| 改 (Replace) | replace(pos, len, str) | 将从索引 pos 开始的 len 个字符,替换为新的字符串 str。 | string s = "I like C"; s.replace(7, 1, "C++"); // 结果变为 "I like C++" |
在 C++ 中读取包含空格的字符串是一个非常常见的需求。因为最基础的 std::cin >> 在遇到空格、制表符(Tab)或换行符时就会自动停止读取,所以我们需要借助其他的函数来实现整行读取。
根据你使用的数据类型(C++ 标准库的 std::string 还是 C 风格的字符数组 char[]),有以下几种主流方法。下面为你进行详解:
读入带空格字符串
一、 String
1. std::getline()
C++
#include <iostream>
#include <string>
#include <limits> // 用于 std::numeric_limits
int main() {
int age;
std::string name;
std::cout << "请输入年龄: ";
std::cin >> age;
// 清除缓冲区中的换行符,否则 getline 会直接读取到这个换行符
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "请输入姓名: ";
std::getline(std::cin, name);
std::cout << "年龄: " << age << ", 姓名: " << name << std::endl;
return 0;
}
-
⚠️ 避坑提示: 如果你在
std::getline之前使用了std::cin >>读取数字,必须先清空缓冲区的换行符,否则getline会读入空字符串:std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
二、 char 数组
2. std::cin.getline()
它是 istream 类的一个成员函数,专门用于读取一行数据到字符数组中,并且自带长度保护。
- 用法:
std::cin.getline(字符数组名, 最大读取长度);
C++
#include <iostream>
int main() {
char str[100]; // 最大容纳 99 个字符 + 1 个 '\0'
std::cout << "请输入: ";
std::cin.getline(str, 100);
std::cout << "输出: " << str << std::endl;
return 0;
}
- 特点: 会读取空格,遇到换行符结束。它会把换行符从缓冲区中取出并丢弃,在字符串末尾自动添加
\0。