CC++ & Algorithm

C++字符串的基本操作

中等37
语言版本:C++Python
概述:学习如何创建、连接、比较和获取长度等字符串基本操作。

玩转C++字符串:像串珠子一样处理文字

你有没有想过,电脑是怎么记住你的名字、你的密码、或者一句“你好”的?在C++里,我们用一种叫 字符串 的东西来存放这些文字。字符串就像一串珍珠项链,每颗珍珠就是一个字符(比如字母、数字、汉字或标点)。如果一条项链能串好多珍珠,那一个字符串就能存好多字符。今天我们就来学会怎么“串珍珠”——创建、连接、比较和获取长度这些基本操作。

要使用字符串,先得打开一个叫做 string 的工具箱。在代码最前面加上 #include <string> 就行啦。

1. 创建字符串:给自己做一条新项链

你想存一个名字、一句问候,或者干脆先做一个空项链(里面一颗珍珠都没有)。C++里有好几种做法:

string name = "小明";            // 直接给名字赋值,就像把珍珠穿好
string greeting("你好!");       // 另一种写法,同样塞进一串文字
string emptyStr;                 // 空字符串,里面没有任何字符,先留着以后用

可以试着把你在游戏里的角色名存进去,或者把妈妈的手机号存进去。记住,双引号 " " 里面就是你要存的文字。

2. 拼接字符串:把两条项链串成一条

你想同时说“小明”和“你好”,就可以用加号 + 把两个字符串连起来。(注意:+号两边的类型都是字符串,不能一边是字符串另一边是数字哦,不过直接加一个字符是可以的。)

string part1 = "小明";
string part2 = ",你好!";
string full = part1 + part2;       // 结果变成 "小明,你好!"
full = full + '!';                 // 还能直接加一个字符 '!' -> 变成 "小明,你好!!"

生活中的例子:你写作业时名字写错了,老师说“小明,请把名字改正”。你可以用字符串拼接把“小明”和“请把名字改正”连成一句话。

3. 获取字符串长度:数数项链上有几颗珍珠

有时候你要知道一句话有几个字。比如你的密码是“abc123”,想检查是不是刚好6位。用 .length() 或者 .size() 方法(两种写法意思一样):

string word = "Hello";
int len = word.length();          // len = 5,因为 H e l l o 共5个字符
cout << "长度是:" << len << endl;

注意:对于中文汉字,一个汉字算一个字符(不过中文字符在电脑里占两个字节,但length()方法按字符个数返回,所以“你好”的长度是2)。

想一想:你输入朋友圈的验证码时,系统经常提示“验证码是6位”,它背后就是用了 .length() == 6 来判断的。

4. 比较字符串是否相等:两条项链一模一样吗?

== 比较两个字符串,就像比较两条项链的珍珠是不是完全一样(顺序、个数、每个字符都要相同)。最常见的用法就是验证密码:

string password = "123456";       // 系统里存的正确密码
string input = "123456";          // 你输入的密码
if (password == input) {
    cout << "密码正确,请进!" << endl;
} else {
    cout << "密码错误,再试试吧。" << endl;
}

除了 ==,还有 !=(不相等)、<> 等比较运算符。字符串比较是按字典顺序(像查字典那样)比较的,比如 "apple" < "banana" 因为 a 在 b 前面。不过对于新手,先用 == 就够了。

5. 用下标访问单个字符:找准位置取珍珠

每条项链上的珍珠都有固定的位置编号。第一个珍珠编号是0,第二个是1,以此类推。用方括号 [ ] 可以拿到那个位置上的字符:

string msg = "ABC";
cout << msg[0] << endl;    // 输出 'A'
cout << msg[2] << endl;    // 输出 'C'

注意:编号不能超过字符串长度减1。如果你写 msg[3],而字符串只有3个字符(下标0,1,2),就会出问题。就像一条只有3颗珍珠的项链,没有第4颗,你硬要去拿,就会拿到奇怪的东西,甚至让程序崩溃。

常见错误(新手一定要小心!)

  1. 忘记 #include <string>
    编译器会报错说 string 不认识。就像你要用螺丝刀但没从工具箱里拿出来。

  2. 下标越界
    string s = "Hi"; cout << s[2]; 会得到未知结果(可能是个乱码)。记住下标范围是 0 ~ length()-1

  3. cin 读字符串遇到空格会停
    比如你输入 Hello World,用 cin >> s; 只能读到 Hello,后面的 World 丢了。怎么读一整行?用 getline(cin, s);

  4. 混淆字符和字符串
    字符用单引号 'A',字符串用双引号 "A"'A' 是单个字符,"A" 是包含一个字符的字符串,它们类型不同,不能直接比较。

  5. 拼接时忘了加空格
    "你好" + "世界" 得到 "你好世界",如果想中间有空格要手动加 "你好 " + "世界""你好" + " " + "世界"

完整示例:一个好玩的名字游戏

下面这个程序问你名字和姓氏,然后拼接成全名,告诉你长度,再比较你是不是叫“张三”。

#include <iostream>
#include <string>          // 字符串工具箱
using namespace std;

int main() {
    string firstName;      // 存储姓
    string lastName;       // 存储名
    string fullName;       // 存储全名

    cout << "请输入你的姓:";
    cin >> firstName;      // 注意:如果姓有空格(如“欧阳”),用getline更好,这里简化
    cout << "请输入你的名:";
    cin >> lastName;

    fullName = firstName + lastName;           // 拼接得到全名
    cout << "你好," << fullName << "!" << endl;
    cout << "你的全名有 " << fullName.length() << " 个字符。" << endl;

    // 用下标访问第一个字符
    cout << "名字的第一个字符是:" << fullName[0] << endl;

    // 判断是不是叫“张三”
    string secret = "张三";
    if (fullName == secret) {
        cout << "哇,你就是传说中的张三!" << endl;
    } else {
        cout << "你不是张三,你是" << fullName << endl;
    }

    return 0;
}

试着运行一下,输入你的姓和名,看看结果。

接下来学什么?

现在你已经会了字符串最基本操作:创建、拼接、取长度、比较、拿单个字符。接下来可以学更强大的操作:

  • 遍历字符串:用循环逐个处理每个字符(比如统计一个句子中有多少个字母'a')。
  • 查找子串find() 方法能帮你找到“苹果”这个词在句子中的位置。
  • 截取子串substr() 可以从字符串中切出一段,就像从长项链上取下几颗珍珠。
  • 替换和插入:把你的名字替换成外号,或者插入一个新词。

加油!字符串是编程里最常用的工具之一,掌握了它,你就可以处理各种文本了。

例题精讲

1单选题

在C++中,以下哪个函数或成员函数用于获取C风格字符串(字符数组)的长度?

Alength()
Bstrlen()
Csize()
Dlen()
2判断题

在C++中,两个std::string对象可以直接使用==运算符进行比较。

3判断题

使用'+'运算符可以将两个C风格字符串(字符数组)直接连接。

4填空题
以下程序使用cin读取一个字符串,请填空补全代码:#include <iostream>
#include <string>
using namespace std;
int main() {
    string name;
    cout << "Enter your name: ";
    ___ >> name;
    cout << "Hello, " << name << endl;
    return 0;
}
5填空题
以下程序使用getline读取包含空格的整行字符串,请填空补全代码:#include <iostream>
#include <string>
using namespace std;
int main() {
    string fullName;
    cout << "Enter your full name: ";
    getline(___, fullName);
    cout << "Hello, " << fullName << endl;
    return 0;
}