C++如何读取含任意空格的输入并合并单位字符串中的空格
解决单位输入中的多空格问题:将带空格的单位合并为无空格字符串
嗨,刚学C++一周就能动手写单位转换程序,已经超棒啦!你遇到的核心问题是如何处理单位字符串中任意数量的空格,把像short tonnes这类带多空格的输入转换成shorttonnes来做匹配对吧?我给你两个简单易懂、适合新手上手的解决方案:
方法一:读取整行输入,手动拆分数值与单位
cin >> mass会在遇到空格时停止读取,没法处理后面带多空格的单位。所以我们可以先把用户的整行输入读进来,再拆分出数值和单位部分,最后移除单位里的所有空格。
代码示例
#include <iostream> #include <string> #include <algorithm> // 用于remove_if函数 #include <cctype> // 用于isspace函数 using namespace std; int main() { cout << "Enter mass: "; string input_line; getline(cin, input_line); // 读取整行输入,保留所有空格 // 拆分数值部分:找到第一个非数字/小数点的位置 size_t split_pos = 0; while (split_pos < input_line.size() && (isdigit(input_line[split_pos]) || input_line[split_pos] == '.')) { split_pos++; } // 将数值字符串转为double类型 double mass = stod(input_line.substr(0, split_pos)); // 提取单位部分并移除所有空格 string unit = input_line.substr(split_pos); // remove_if把空格移到字符串末尾,erase删除末尾无效部分 unit.erase(remove_if(unit.begin(), unit.end(), ::isspace), unit.end()); // 现在可以用无空格的unit做匹配啦 if (unit == "shorttonnes" || unit == "shtn") { cout << mass << " short tonnes is " << mass * 0.907185 << " long tonnes\n"; } else if (unit == "kg") { cout << mass << " kg is " << mass * 2.20462 << " pounds\n"; } else { cout << "Unknown unit!\n"; } return 0; }
关键步骤解释
getline(cin, input_line):一次性读取用户输入的整行内容,不管中间有多少空格或制表符。- 拆分数值与单位:通过循环找到第一个不是数字或小数点的位置,前面的内容是数值,后面的是单位。
- 移除空格:
remove_if会把所有空白字符移到字符串末尾,再用erase删掉这些无效的空白,最终得到无空格的单位字符串。
方法二:保留cin读数值,再读取剩余单位内容
如果你不想改动读取数值的方式,也可以先读入数值,再把剩下的所有内容作为单位读取,最后处理空格。
代码示例
#include <iostream> #include <string> #include <algorithm> #include <cctype> #include <limits> // 用于处理输入缓冲区的残留字符 using namespace std; int main() { cout << "Enter mass: "; double mass; cin >> mass; // 读取数值,自动跳过前面的空格 // 清除数值后面的所有残留字符(包括空格、换行),避免影响后续读取 cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 读取数值之后的所有内容作为单位 string unit; getline(cin, unit); // 移除单位中的所有空格 unit.erase(remove_if(unit.begin(), unit.end(), ::isspace), unit.end()); // 匹配逻辑和方法一一致 if (unit == "shorttonnes" || unit == "shtn") { cout << mass << " short tonnes is " << mass * 0.907185 << " long tonnes\n"; } else if (unit == "kg") { cout << mass << " kg is " << mass * 2.20462 << " pounds\n"; } else { cout << "Unknown unit!\n"; } return 0; }
小提示
- 如果你的编译器版本较老,不支持
stod函数,可以用atof(input_line.substr(0, split_pos).c_str())来实现字符串转double。 ::isspace前面的双冒号是为了调用全局的空格判断函数,避免和std命名空间里的同名函数冲突。- 测试时可以尝试各种输入格式,比如
10.5 short tonnes、3 kg,验证程序的兼容性。
内容的提问来源于stack exchange,提问作者Sabrina Tessier
相关产品推荐
相关产品推荐

