☰
C++ 第 20 课:std::string 字符串
2026/10/3 14:35:17 网站建设 项目流程

上一课标准答案:

    data[0] = 10 data[2] = 30 data.size() = 3
    1. data里面依次是:
    5, 10, 15
    1. 最后:
    q = {10, 50, 30}
    1. 因为:
    data.size()

    会根据vector当前实际元素数量自动变化;如果后续push_back()增加了数据,循环仍然能遍历全部元素。固定写6就不够灵活。


    第 20 课:std::string字符串

    这一课很重要,因为真实机器人程序里会大量出现:

    "ERROR" "CONNECTED" "/dev/ttyUSB0" "joint_states" "base_link" "camera"

    这些都是字符串。


    1. 先解决一个你之前埋下的问题

    我们以前见过:

    char grade = 'A';

    又见过:

    std::cout << "Hello" << std::endl;

    注意:

    'A'

    和:

    "A"

    完全不是一回事。

    最简单记法:

    'A' → 一个字符 "A" → 一串字符,也就是字符串

    2.char是一个字符

    例如:

    char state = 'A';

    这里只能表示:

    一个字符A

    例如:

    char c1 = 'R'; char c2 = '1'; char c3 = '?';

    都是单个字符。

    使用:

    ' '

    单引号。


    3. 字符串是很多字符连在一起

    例如:

    Robot

    实际上可以想象成:

    'R' 'o' 'b' 'o' 't'

    所以字符串不是一个字符,而是一串字符。

    C++ 中现代常用写法:

    std::string name = "Robot";

    4. 使用std::string要准备什么?

    通常需要:

    #include <string>

    完整一点:

    #include <iostream> #include <string>

    然后:

    std::string name = "Robot";

    5. 逐部分拆开

    std::string name = "Robot";

    这里:

    std::string

    表示:

    字符串类型。


    name

    是变量名。


    "Robot"

    是具体字符串内容。

    所以整句:

    创建一个字符串变量name,里面保存"Robot"。


    6. 为什么又有std::

    你之前学过:

    std::cout

    可以先理解成:

    std里面的cout

    同理:

    std::string

    就是:

    C++ 标准库std里面的string

    所以现在你又看到一个标准库工具。


    7. 输出字符串

    例如:

    #include <iostream> #include <string> int main() { std::string robot_name = "JYKER"; std::cout << robot_name << std::endl; return 0; }

    输出:

    JYKER

    8. 字符串可以重新赋值

    例如:

    std::string state = "Idle"; state = "Running";

    最后:

    state = "Running"

    和普通变量一样:

    int a = 5; a = 10;

    字符串变量也可以修改。


    9. 字符串可以比较

    例如:

    std::string state = "ERROR"; if (state == "ERROR") { std::cout << "Stop robot" << std::endl; }

    这里:

    state == "ERROR"

    表示:

    判断字符串内容是否等于"ERROR"。

    如果成立,就进入if。

    这在机器人状态判断里很常见。


    10. 机器人状态例子

    std::string state = "CONNECTED"; if (state == "CONNECTED") { std::cout << "Robot ready" << std::endl; } else { std::cout << "Robot not ready" << std::endl; }

    因为:

    state = CONNECTED

    所以输出:

    Robot ready

    11. 字符串可以拼接

    这是std::string很方便的地方。

    例如:

    std::string first = "Joint"; std::string second = "1"; std::string result = first + second;

    最后:

    result = "Joint1"

    这里:

    +

    不再是数字加法,而是:

    字符串拼接。


    12. 再看一个更自然的例子

    std::string name = "Joint"; std::string state = " Ready"; std::string message = name + state;

    最后:

    Joint Ready

    因为:

    "Joint" + " Ready"

    拼在一起。


    13. 但字符串和数字不能随便直接相加

    例如:

    std::string name = "Joint"; int id = 1;

    你不能简单认为:

    std::string result = name + id;

    就会自动得到:

    Joint1

    这里会涉及类型转换。

    以后我们会专门讲:

    std::to_string()

    现在先不展开。


    14. 字符串长度

    和vector类似,string也有:

    .size()

    例如:

    std::string name = "Robot";

    那么:

    name.size()

    得到:

    5

    因为:

    R o b o t 1 2 3 4 5

    一共 5 个字符。


    15. 也可以用.length()

    例如:

    name.length()

    也能得到字符串长度。

    对于std::string:

    .size()

    和:

    .length()

    在这里基本可以理解成同样用途。


    16. 字符串也可以像数组一样访问

    例如:

    std::string name = "Robot";

    那么:

    name[0] = 'R' name[1] = 'o' name[2] = 'b' name[3] = 'o' name[4] = 't'

    注意:

    字符串下标也从 0 开始。

    所以:

    std::cout << name[0] << std::endl;

    输出:

    R

    17. 为什么name[0]是char

    因为字符串本质上由一个个字符组成。

    例如:

    std::string name = "Robot";

    可以粗略想成:

    [0] [1] [2] [3] [4] R o b o t

    所以:

    name[0]

    得到的是:

    'R'

    也就是一个char。


    18. 一个机器人串口名称例子

    以后 Linux / ROS / 串口通信里,你可能看到:

    std::string port = "/dev/ttyUSB0";

    这表示:

    串口设备名称。

    然后可能传给某个函数:

    openSerial(port);

    你现在至少已经知道:

    port

    是一个字符串变量。


    19. ROS2 里面字符串非常多

    以后你可能看到:

    std::string topic = "/joint_states";

    或者:

    std::string frame = "base_link";

    这些都只是:

    字符串数据。

    所以以后看到 ROS2 那些名字,不要觉得神秘。

    本质上:

    "/joint_states" "base_link" "camera_link"

    都只是字符串。


    20. 字符串和char一定区分

    这个要形成条件反射。

    一个字符

    char state = 'A';

    用:

    'A'

    单引号。


    字符串

    std::string state = "ERROR";

    用:

    "ERROR"

    双引号。

    所以:

    'A' char "A" 字符串

    即使里面都只有一个字母,也不是同一种类型。


    21. 一个完整机器人状态程序

    #include <iostream> #include <string> int main() { std::string robot_state = "ERROR"; if (robot_state == "ERROR") { std::cout << "Stop robot" << std::endl; } else if (robot_state == "RUNNING") { std::cout << "Robot running" << std::endl; } else { std::cout << "Unknown state" << std::endl; } return 0; }

    这里你现在已经能看懂绝大部分。

    因为:

    robot_state = ERROR

    所以:

    robot_state == "ERROR"

    成立。

    最终输出:

    Stop robot

    22. 一个字符串循环例子

    std::string name = "ARM"; for (int i = 0; i < name.size(); i++) { std::cout << name[i] << std::endl; }

    依次输出:

    A R M

    这实际上把你之前学的:

    for 数组下标 size() string

    连接起来了。


    23. 本课最核心的 5 个写法

    创建:

    std::string name = "Robot";

    比较:

    name == "Robot"

    拼接:

    a + b

    长度:

    name.size()

    访问字符:

    name[0]

    本课小练习

    第 1 题

    下面两个分别是什么类型?

    'A'

    和:

    "A"

    第 2 题

    std::string name = "Robot";

    那么:

    name[0] = ? name[2] = ? name.size() = ?

    第 3 题

    std::string state = "ERROR"; if (state == "ERROR") { std::cout << 1 << std::endl; } else { std::cout << 2 << std::endl; }

    输出什么?


    第 4 题

    std::string a = "Joint"; std::string b = " Ready"; std::string c = a + b;

    最后c是什么?

    下一课我们会进入:

    第 21 课:struct

    这一步会非常适合机器人。

    因为现在一个关节不只有:

    angle

    它还可能有:

    angle speed current temperature enabled

    我们不希望定义一堆散乱变量,而会开始把它们打包成:

    struct Joint { double angle; double speed; bool enabled; };

    这会是你从“写小程序”走向“组织真实机器人数据”的第一步。

    需要专业的网站建设服务?

    联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

    立即咨询