You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

关键步骤解释

  1. getline(cin, input_line):一次性读取用户输入的整行内容,不管中间有多少空格或制表符。
  2. 拆分数值与单位:通过循环找到第一个不是数字或小数点的位置,前面的内容是数值,后面的是单位。
  3. 移除空格: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:53:59