字符和字符串

Done ACM/ICPC Start at: 2025-12-16 14:30 200 hour(s) Host: 39

一、核心原则

先记住:C++里的std::string就像“装文字的盒子”,可以存一句话、一个词语,操作起来和搭积木一样简单,使用前要先写 #include <string>#include <iostream>(用来输出看结果)。

二、小学生必学的字符串操作(附趣味示例)

1. 定义字符串(创建“文字盒子”)

作用:给字符串起名字,存想要的文字。 语法string 名字 = "文字内容"; 示例

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

int main() {
    // 定义字符串,存名字、句子
    string name = "小明";
    string sentence = "我喜欢编程!";
    // 输出字符串(cout 是“打印”的意思)
    cout << "名字:" << name << endl;
    cout << "句子:" << sentence << endl;
    return 0;
}

运行结果

名字:小明
句子:我喜欢编程!

2. 字符串拼接(把两个“盒子”的文字合起来)

作用:把多个字符串连在一起,比如“姓”+“名”、“句子”+“表情”。 语法:用 ++=(直接追加)。 示例

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

int main() {
    string lastName = "张";
    string firstName = "三";
    // 拼接全名
    string fullName = lastName + firstName;
    cout << "全名:" << fullName << endl;

    string talk = "今天天气好";
    // 追加文字(直接在原字符串后面加)
    talk += ",适合出去玩!";
    cout << "完整的话:" << talk << endl;
    return 0;
}

运行结果

全名:张三
完整的话:今天天气好,适合出去玩!

3. 查字符串长度(数文字有多少个)

作用:看字符串里有多少个字符(一个汉字/字母/标点都算1个)。 语法字符串名.size()字符串名.length()(两个用法完全一样)。 示例

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

int main() {
    string word = "苹果";
    string sentence = "我有5个苹果!";
    // 查长度
    cout << "“苹果”的长度:" << word.size() << endl;
    cout << "句子的长度:" << sentence.length() << endl;
    return 0;
}

运行结果

“苹果”的长度:2
句子的长度:7

4. 字符串比较(判断两个“盒子”的文字是否一样)

作用:判断两个字符串内容是否相同(比如验证密码、找相同的词语)。 语法:用 ==(一样)、!=(不一样)。 示例

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

int main() {
    string password = "123456";
    string input = "123456";
    
    // 比较是否一样
    if (password == input) {
        cout << "密码正确!" << endl;
    } else {
        cout << "密码错误!" << endl;
    }

    string fruit1 = "香蕉";
    string fruit2 = "橘子";
    if (fruit1 != fruit2) {
        cout << "两个水果不一样!" << endl;
    }
    return 0;
}

运行结果

密码正确!
两个水果不一样!

5. 截取子串(从长字符串里“抠”出一小段)

作用:从字符串里取出指定位置的部分文字(比如从“一年级二班”里抠出“二班”)。 语法字符串名.substr(起始位置, 截取长度)(注意:起始位置从0开始数!)。 示例

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

int main() {
    string classInfo = "一年级二班";
    // 从位置3开始,截取2个字符(位置0:一,1:年,2:级,3:二,4:班)
    string className = classInfo.substr(3, 2);
    cout << "班级:" << className << endl;

    string phone = "13812345678";
    // 截取后4位(从位置7开始,截4个)
    string last4 = phone.substr(7, 4);
    cout << "手机号后4位:" << last4 << endl;
    return 0;
}

运行结果

班级:二班
手机号后4位:5678

6. 清空字符串(把“盒子”里的文字删掉)

作用:清空字符串里的所有内容,变成空盒子。 语法字符串名.clear()示例

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

int main() {
    string note = "今天要写作业";
    cout << "清空前:" << note << endl;
    // 清空
    note.clear();
    cout << "清空后:" << "[" << note << "]" << endl; // 括号里是空的
    return 0;
}

运行结果

清空前:今天要写作业
清空后:[]

三、小学生入门小练习(可直接运行)

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

int main() {
    // 练习1:拼接自己的名字和学校
    string myName = "李华";
    string mySchool = "阳光小学";
    string info = myName + "在" + mySchool + "读三年级。";
    cout << info << endl;

    // 练习2:查自己名字的长度
    cout << "我的名字有" << myName.size() << "个字" << endl;

    // 练习3:截取学校名称里的“小学”
    string schoolPart = mySchool.substr(2, 2);
    cout << "学校类型:" << schoolPart << endl;

    return 0;
}

运行结果

李华在阳光小学读三年级。
我的名字有2个字
学校类型:小学

四、简单总结(小学生能记住的)

  1. string 定义文字变量,就像给“文字盒子”起名字;
  2. + 可以把文字连起来,size() 能数文字个数;
  3. == 能判断两个文字是否一样,substr 能抠出想要的小段文字;
  4. 所有操作都要先写 #include <string>#include <iostream>

如果想练某类具体场景(比如输入文字、找字符串里的某个字),可以说,我再做更简单的示例~

针对小学生的理解能力,我把 substr(截取子串)、erase(删除字符),以及和它们搭配常用的 insert(插入字符)、replace(替换字符)都整理成「简单解释+趣味示例」,这些是除了查找类函数外,小学生最常用的字符串操作~

针对小学生的理解能力,咱们把 find() 函数拆成超简单的解释+趣味示例,核心就讲:find() 是用来「找字符串里的某个字/某段文字,看它在第几个位置」。

一、先记核心知识点(小学生版)

  1. 作用:在一个字符串里,找指定的字/词语,返回它的“位置编号”;如果没找到,就返回一个特殊值(记成“没找到”就行)。
  2. 位置编号规则:从 0 开始数(不是从 1 开始!),比如“苹果派”里,“苹”是 0,“果”是 1,“派”是 2。
  3. 语法字符串名.find(要找的内容)

二、超简单示例(直接能运行)

示例1:找单个字

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

int main() {
    // 定义一个字符串(比如一句话)
    string sentence = "我爱吃苹果";
    
    // 找“苹”字的位置
    int pos = sentence.find("苹");
    
    // 输出结果
    cout << "“苹”字在第" << pos << "个位置(从0开始数)" << endl;
    
    return 0;
}

运行结果
“苹”字在第4个位置(从0开始数)
(数一下:我(0)、爱(1)、吃(2)、苹(3)?哦不对,重新数:“我(0)、爱(1)、吃(2)、苹(3)、果(4)”——如果示例里写“苹”,pos是3,修正示例更直观👇)

修正后示例1:

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

int main() {
    string sentence = "我爱吃苹果";
    // 找“苹”字
    int pos = sentence.find("苹");
    cout << "句子:" << sentence << endl;
    cout << "“苹”字的位置是:" << pos << endl; // 结果是3
    return 0;
}

运行结果

句子:我爱吃苹果
“苹”字的位置是:3

示例2:找一段文字(词语)

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

int main() {
    string story = "小猫钓鱼,小猫抓老鼠";
    
    // 找“小猫”这个词语(找第一次出现的位置)
    int pos = story.find("小猫");
    
    cout << "“小猫”第一次出现在第" << pos << "个位置" << endl;
    return 0;
}

运行结果
“小猫”第一次出现在第0个位置

示例3:判断“有没有找到”(重点!)

find() 如果没找到目标,会返回 string::npos(可以理解成“找不到的标记”),咱们用 if 判断就行:

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

int main() {
    string fruit = "香蕉、橘子、葡萄";
    
    // 找“苹果”在不在里面
    int pos = fruit.find("苹果");
    
    if (pos != string::npos) { // 不等于“没找到”,就是找到了
        cout << "找到苹果啦,位置是:" << pos << endl;
    } else {
        cout << "没找到苹果哦~" << endl;
    }
    return 0;
}

运行结果
没找到苹果哦~

三、小学生专属小练习(动手试)

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

int main() {
    // 自己改一改:把名字/要找的字换成自己的
    string myName = "王小明";
    string wantFind = "明";
    
    // 找“明”字的位置
    int pos = myName.find(wantFind);
    
    cout << "我的名字是:" << myName << endl;
    cout << "“" << wantFind << "”字在第" << pos << "个位置" << endl;
    
    // 额外:找“小红”在不在名字里
    int pos2 = myName.find("小红");
    if (pos2 == string::npos) {
        cout << "我的名字里没有小红哦~" << endl;
    }
    return 0;
}

运行结果

我的名字是:王小明
“明”字在第2个位置
我的名字里没有小红哦~

四、一句话总结(小学生能记住)

find() 就像“文字寻宝”:告诉它要找的字/词语,它会告诉你藏在第几个位置(从0数),找不到就告诉你“没找到”。

如果想练更有趣的场景(比如找手机号里的“8”、找句子里的“玩”字),可以说,咱们再做定制示例~

一、核心函数速览(小学生版)

函数名 一句话解释(小学生版) 简单语法
substr 从字符串里“抠”出一小段文字 字符串名.substr(起始位置, 截取长度)
erase 从字符串里“删掉”指定位置的文字 字符串名.erase(起始位置, 要删的长度)
insert 在字符串指定位置“插入”文字 字符串名.insert(插入位置, 要插的文字)
replace 把字符串里指定位置的文字“替换”成新文字 字符串名.replace(起始位置, 替换长度, 新文字)

二、逐个讲透(附可直接运行的示例)

1. substr —— 抠出想要的小段文字

关键:起始位置从 0 开始数,第二个参数是“要抠几个字”。

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

int main() {
    string info = "三年级五班的小明";
    
    // 从位置0开始,抠3个字(“三年级”)
    string grade = info.substr(0, 3);
    // 从位置3开始,抠2个字(“五班”)
    string cls = info.substr(3, 2);
    // 从位置7开始,抠2个字(“小明”)
    string name = info.substr(7, 2);
    
    cout << "年级:" << grade << endl;
    cout << "班级:" << cls << endl;
    cout << "名字:" << name << endl;
    return 0;
}

运行结果

年级:三年级
班级:五班
名字:小明

2. erase —— 删掉不要的文字

关键:指定“从哪删”“删几个”,删完剩下的文字会自动连起来。

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

int main() {
    string sentence = "我不喜欢吃胡萝卜";
    
    // 从位置2开始,删2个字(删掉“不喜”)
    sentence.erase(2, 2);
    
    cout << "删完后的句子:" << sentence << endl; // 结果“我欢吃胡萝卜”
    return 0;
}

运行结果

删完后的句子:我欢吃胡萝卜

3. insert —— 插入想加的文字

关键:指定“插在哪”,新文字会出现在这个位置前面。

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

int main() {
    string gift = "我有一本书";
    
    // 在位置3(“一”前面)插入“好看的”
    gift.insert(3, "好看的");
    
    cout << "插入后的句子:" << gift << endl; // 结果“我有好看的一本书”
    return 0;
}

运行结果

插入后的句子:我有好看的一本书

4. replace —— 把旧文字换成新文字

关键:指定“从哪换”“换几个字”,用新文字替换掉。

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

int main() {
    string animal = "小猫喜欢吃鱼";
    
    // 从位置0开始,把2个字(“小猫”)换成“小狗”
    animal.replace(0, 2, "小狗");
    
    cout << "替换后的句子:" << animal << endl; // 结果“小狗喜欢吃鱼”
    return 0;
}

运行结果

替换后的句子:小狗喜欢吃鱼

三、综合小练习(一次练会所有函数)

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

int main() {
    // 初始句子:可以换成自己喜欢的话
    string s = "今天我吃了苹果,明天我要吃香蕉";
    
    // 1. substr:抠出“苹果”
    string fruit1 = s.substr(7, 2);
    cout << "抠出的第一个水果:" << fruit1 << endl;
    
    // 2. replace:把“香蕉”换成“草莓”
    s.replace(15, 2, "草莓");
    cout << "替换后:" << s << endl;
    
    // 3. insert:在“草莓”前插入“甜甜的”
    s.insert(15, "甜甜的");
    cout << "插入后:" << s << endl;
    
    // 4. erase:删掉“今天我吃了”
    s.erase(0, 6);
    cout << "删除后最终句子:" << s << endl;
    
    return 0;
}

运行结果

抠出的第一个水果:苹果
替换后:今天我吃了苹果,明天我要吃草莓
插入后:今天我吃了苹果,明天我要吃甜甜的草莓
删除后最终句子:苹果,明天我要吃甜甜的草莓

四、小学生专属总结(好记版)

函数 做什么 小口诀
substr 抠文字 先数位置,再数个数
erase 删文字 从哪删,删几个
insert 加文字 插在哪,加什么
replace 换文字 换哪段,换成啥

所有操作都要记住:位置从 0 开始数(比如“苹果”的“苹”是 0,“果”是 1),如果想练更贴合小学生的场景(比如改名字、拼句子、删错题),可以说,咱们再做定制示例~

Status
Done
Rule
ACM/ICPC
Problem
12
Start at
2025-12-16 14:30
End at
2025-12-24 22:30
Duration
200 hour(s)
Host
Partic.
39