C++如何通过std::cin输入的字符串按名称查找对应变量值
问题背景
我正在开发一款购物车程序,需要实现的逻辑为:程序提示输入商品时,用户输入对应商品名称后,程序要记录该商品对应的取值,供后续代码逻辑调用。
当前编写的代码如下:
#include <iostream> int main() { int item{}; int apple = 5; std::cout << "what item do you want to buy?"; std::cin >> item; std::cout << item; return 0; }
运行上述代码时,如果输入apple,输出结果为0。预期实现效果为:输入apple时,变量item能够获取到同名变量apple对应的数值5。
问题原因
C++是静态编译型语言,代码里定义的变量名(比如示例中的apple)在编译完成后会被替换为内存地址引用,运行阶段不存在“输入变量名文本直接读取对应变量值”的内置反射机制。
当前代码中item被定义为int整数类型,std::cin读取整数时遇到非数字的字符串输入(比如apple)会直接进入读取失败状态,不会给item写入新值,item会保持初始化时的0值,因此最终输出0。
实现方案
你需要先建立「商品名称字符串 -> 商品对应取值」的映射关系,先读取用户输入的字符串格式的商品名,再从映射关系中匹配对应的取值即可。C++标准库提供的std::unordered_map/std::map键值对容器是最适合该场景的实现方式,修改后的可运行代码如下:
#include <iostream> #include <unordered_map> #include <string> int main() { // 初始化商品名到对应取值的映射表 std::unordered_map<std::string, int> item_map = { {"apple", 5} // 后续新增商品只需在此添加键值对即可,例如 {"banana", 3}, {"orange", 2} }; std::string input_name; std::cout << "what item do you want to buy?"; std::cin >> input_name; // 校验输入商品是否存在于映射表中 if (item_map.count(input_name)) { int item = item_map[input_name]; std::cout << item << std::endl; } else { std::cout << "The entered item does not exist" << std::endl; } return 0; }
如果商品数量极少,也可以用字符串比较的分支判断实现,不需要引入额外容器:
#include <iostream> #include <string> int main() { std::string input_name; int item = 0; std::cout << "what item do you want to buy?"; std::cin >> input_name; if (input_name == "apple") { item = 5; std::cout << item << std::endl; } else { std::cout << "The entered item does not exist" << std::endl; } return 0; }
注意事项
- 不要直接给整数类型变量输入字符串内容,会触发输入流的失败状态,若后续还有输入操作需要调用
std::cin.clear()重置流状态,同时清空缓冲区残留数据。 - 商品数量较多时优先使用键值对容器维护映射关系,新增、修改商品取值不需要改动核心业务逻辑,只需要更新映射表内容,可维护性远高于多分支判断写法。
内容的提问来源于stack exchange,提问作者Maravic Karlo
相关产品推荐
相关产品推荐

