返回项目列表

/note/ICPC笔记

ICPC笔记

当前项目读取 content/notes/ICPC笔记 下的 Markdown 文件。

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 之前插入完整的字符串 strstring 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 个字符,替换为新的字符串 strstring 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