为什么我的质量计算器不能在空格上正常工作

Why does my mass calculator not work properly with spaces?

本文关键字:常工作 工作 空格 我的 计算器 不能 为什么      更新时间:2023-10-16
#include <iostream>
#include <string>

using namespace std;
/*
Function Name: weightConv
Purpose: To take the weight and convert the following number to the coressponding weight unit
Return : 0
*/
  double weightConv(double w, string weightUnit)
{
      if (weightUnit == "g" || weightUnit == "G" )
        cout << " Mass = " <<  w * 0.035274 << "oz";
    else if (weightUnit == "oz"||weightUnit == "OZ"||weightUnit == "oZ" ||weightUnit == "Oz")
        cout << " Mass = " <<  w / 28.3495 << "g";
    else if (weightUnit == "kg"||weightUnit == "KG"||weightUnit == "Kg" ||weightUnit == "kG")
        cout << " Mass = " <<  w * 2.20462 << "lb";
    else if (weightUnit == "lb" ||weightUnit == "LB" ||weightUnit== "Lb" ||weightUnit == "lB")
        cout << " Mass = " <<  w * 0.453592 << "kg";
    else if (weightUnit == "Long tn" ||weightUnit == "LONG TN"|| weightUnit == "long tn" || weightUnit == "long ton")
        cout << " Mass = " <<  w * 1.12 << "sh tn";
    else if (weightUnit == "sh tn" || weightUnit == "SH TN")
        cout << " Mass = " << w / 0.892857 << " Long tons";
    else if (weightUnit == "s" || weightUnit == "S")
        cout << " Mass = " << w * 6.35029 << "stones";
    else
        cout << "Is an unknown unit and cannot be converted";
    return 0;   
}// end of weightCov function

int main()
{
    for (;;)
    {
        double mass;
        string unitType;
        cout << "Enter a mass and its unit type indicator(g,kg,lb,oz,long tn,or sh tn)" << endl;
        cin >> mass >> unitType;
            // Output Results
            cout << weightConv(mass, unitType) << endl;
    }// end of for loop
}// end of main 

没有空间的重量单位效果很好。问题是长tn(长吨)和sh tn(短吨)单位不起作用,我假设这是因为字符串之间的空间。谁能帮忙。提前谢谢。

std::istream 在此处使用的operator>>(std::string &)

cin >> mass >> unitType;

读取以空格分隔的标记。这意味着当您在输入流中输入"12 long tn"时,mass将被12.0unitType将被"long"

问题的解决方案可能涉及std::getline,如

std::cin >> mass;
std::getline(std::cin, unitType);

这将读取到下一个换行符。但是,这不会像operator>>那样去除前导空格,因此您将留下" long tn"而不是"long tn"。您需要显式忽略这些空格,如下所示:

std::cin >> std::ws;

这最终会给你留下

std::cin >> mass >> std::ws;      // read mass, ignore whitespaces
std::getline(std::cin, unitType); // the rest of the line is the unit

请注意,这不会删除尾随空格,因此如果用户键入 "12 long tn " ,它将无法识别该单位。如果这是一个问题,您必须从unitType末尾手动剥离它们。

istream::operator>>

空格字符进行标记。当您输入 sh tn 时,只有sh会保存在unitType中,tn将保留在流中。

当您在流中获得shlong时,请检查另一个令牌并查看它是否tn。一个健壮的解决方案可能是一个具有自由函数std::istream& operator>>(std::istream, Unit&)Unit类,用于执行流提取。