女孩和机器人一起思考

一起动脑筋 · 先看一个小故事

女孩想数 BANANA 里有几个 A。机器人从左往右,每找到一个就加一笔。

把过程摊开来看

沿着编号看一遍,再用自己的话讲一遍
  1. B计数 0
  2. A计数 1
  3. 继续 NANA再遇两个 A
  4. 结果3

遍历字符串可以逐项检查并统计。

准备一个计数器,只有当前字符符合条件时才加 1。找 A 的规则要明确是否也包括小写 a。

01怎样逐个访问字符串?

std::string s = "code";

for (std::size_t i = 0; i < s.size(); i++) {
    std::cout << s[i] << '\n';
}

会依次输出 c、o、d、e。

02也可以用范围 for

for (char c : s) {
    std::cout << c;
}

这种写法适合只关心每个 char 值、不需要下标的场景。

03怎样统计某个字符出现次数?

int count = 0;

for (char c : s) {
    if (c == 'a') {
        count++;
    }
}

每遇到一个 'a' 就让计数器加 1。

04怎样修改字符串里的字符?

std::string s = "cat";
s[0] = 'b';

修改后字符串变成 "bat"

也可以使用引用遍历:

for (char& c : s) {
    // 可以直接修改 c
}

05怎样找一个子串?

std::string s = "computer";
auto pos = s.find("put");

如果找到,pos 是子串第一次出现的位置;如果没找到,结果是 std::string::npos

06UTF-8 中文为什么不能这样简单遍历?

如果字符串包含 UTF-8 中文或 emoji:

std::string s = "你好";

char 遍历时,通常是在逐个读取 UTF-8 编码字节,而不是一次得到一个完整汉字。

07遍历字符串时也会越界吗?

会。合法下标仍然是:

0 到 s.size() - 1(当字符串非空时)

s[s.size()] 不应该被当作普通可访问字符位置来使用。

如果希望运行时边界检查,可以使用 s.at(i)

你已经知道了什么

  • std::string 可以用下标或范围 for 遍历。
  • 遍历可以用于统计、查找、修改。
  • find 可以查找子串。
  • 字符串下标同样要避免越界。
  • UTF-8 下按 char 遍历的是字节,不一定是完整 Unicode 字符。

下一篇:数组能帮我们解决哪些问题?

轮到你来试一试

AaA 中只数大写 A,会得到 3 吗?

想好了吗?点开看解释

得到 2。中间的小写 a 与大写 A 不同。若希望两者都算,必须明确调整规则。