C++如何读取命令行中双引号内子串以实现AVL树插入操作
解决方案
你当前用cin >> Name读取名字的逻辑不生效,是因为cin默认以空白字符作为分隔符,遇到空格、制表符、换行就会停止读取,只能拿到引号内第一个空格前的部分内容,无法读取完整的带空格的名字,也不会自动剔除前后的双引号。
方案1:使用标准库std::quoted(推荐)
C++11及之后版本的标准库提供了std::quoted工具,专门用于读取带双引号包裹的字符串,会自动剔除前后的双引号,还支持处理字符串内部的转义引号,仅需要引入<iomanip>头文件即可,修改成本极低。
修改后的代码如下:
#include <iomanip> // 引入std::quoted所需头文件 // 其他原有头文件保留 #include <iostream> #include <string> using namespace std; // ... 你的其他代码 if (command == "insert") // 注意你原来的变量名拼写是comand,这里修正为正确拼写 { int ID = 0; string Name; cin >> std::quoted(Name); // 替换原来的cin >> Name cin >> ID; root = insertInfo(root, Name, ID); }
方案2:手动实现引号内容读取
如果你使用的C版本不支持C11,或者需要自定义读取逻辑,可以手动控制读取流程:先跳过第一个双引号前的所有内容,再读取到下一个双引号之前的内容作为名字,需要引入<limits>头文件处理流忽略逻辑。
代码示例如下:
#include <limits> // 引入numeric_limits所需头文件 // 其他原有头文件保留 #include <iostream> #include <string> using namespace std; // ... 你的其他代码 if (command == "insert") { int ID = 0; string Name; // 跳过所有字符直到遇到第一个双引号,同时把这个双引号丢弃 cin.ignore(numeric_limits<streamsize>::max(), '"'); // 读取所有字符直到遇到下一个双引号,内容存入Name,双引号自动丢弃 getline(cin, Name, '"'); cin >> ID; root = insertInfo(root, Name, ID); }
内容的提问来源于stack exchange,提问作者Parth Yagnik
相关产品推荐
相关产品推荐

