上一课标准答案:
data[0] = 10 data[2] = 30 data.size() = 3data里面依次是:
5, 10, 15- 最后:
q = {10, 50, 30}- 因为:
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; }输出:
JYKER8. 字符串可以重新赋值
例如:
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 ready11. 字符串可以拼接
这是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;输出:
R17. 为什么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 robot22. 一个字符串循环例子
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; };这会是你从“写小程序”走向“组织真实机器人数据”的第一步。