首页 / 资讯中心 / 文章详情

C++ 第 20 课:std::string 字符串

C++ 第 20 课:std::string 字符串 ★ FEATURED ARTICLE
上一课标准答案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; };这会是你从“写小程序”走向“组织真实机器人数据”的第一步。
阅读完成 · 觉得有帮助?
咨询建站