如何在c ++中读取输入字符串,忽略空格

时间:2018-05-16 02:32:38

标签: c++ string cin

我的任务是创建一个程序,将一个计量单位转换为另一个单位。因此,如果用户输入5千克,则将其转换为相当于磅的数量。要求声明必须在一行中读取用户输入,并且输入中任何位置的任何数量的空格都不能消除功能。我的问题是这样的:如果用户输入他们的输入,在实际的双重'质量之间有一堆空格。值,然后在测量单位中的不同单词之间,例如“短吨”,我如何消除间距,使其只读取"短路"? 到目前为止,我的代码是:

double mass;  string unit;
    cout << "Enter mass: ";
    cin >> mass;
    cin.ignore();
    cin >> unit;

    if (unit == "short tonnes" || unit == "sh tn")
    {
        //convert to long tonnes
    }

我的代码在输入双质量值之前忽略空格,以及在输入字符串的第一部分之前忽略空格。但我无法弄清楚如何让我的节目阅读&#34;短吨&#34;只是&#34; shorttonnes&#34; (无论单词之间的空格数是多少),这样我就可以进行字符串比较并根据需要转换质量值。提前感谢您的帮助,请不要讨厌我,我在学习C ++的第一周。

2 个答案:

答案 0 :(得分:3)

我再次道歉。发布编辑,我认为我最初的评论是正确的。按照其他人的建议获取getline行。然后将该行放在std::istringstream中。使用stringstream读取>>中的单词并将其与+运算符连接起来,直到您组装了一个您正在寻找的标记。 >>的默认行为是为您丢弃所有空格。

因此...

std::string line;
while (std::getline(cin, line)) // reads in a line
{
    std::istringstream stream(line);
    std::string spaceless;
    std::string word;
    while (stream >> word) // get words on the line without any whitespace
    {
        spaceless += word; // assemble without spaces
        if (spaceless ==  "shorttonnes")
        {
            //do something with spaceless
        }
        else if (spaceless ==  "Someothertoken")
        {
            // do something else with spaceless
        }
        else if ( ... ) 
        {
            // rinse, repeat
        }
    }
}

这是一个简单的,简化的连接示例:https://ideone.com/hGLr6f

您可以使用其他技术代替if / else if链。一个std::map的字符串和函数指针,但这是另一个问题。

答案 1 :(得分:1)

std::copy_if()是另一种做你想做的事情。值得了解它是如何工作的,因为它可以在许多其他地方找到用途,除了这个特殊的问题。

如果您编写此空间删除例程,如果您必须在不同情况下再次解决此问题,它将成为您可以重复使用的组件。

void StripSpaces(std::string &str)
{
    std::vector<char> temp;
    temp.resize(str.length());
    auto pred = [] (char &c)
    {
        return c != ' ';
    };
    auto temp_end = std::copy_if(str.begin(), str.end(), temp.begin(), pred);
    str = std::string(temp.begin(), temp_end);
}

这样就可以从字符串中删除空格。

vector<char>用来保存结果值。它首先调整为输入字符串的长度,知道结果不能超过输入。

pred是一个lambda,它只接受一个字符作为它的参数,并返回一个bool,当且仅当该字符不是空格时才为真。

std::copy_if解除了沉重的负担。它会将源字符串中的字符复制到temp,但前提是pred为该字符返回true。它返回一个迭代器,它引用我们复制的最后一个字符之后的元素。如果您想将temp.end()视为保留结果字符串,这可以非常方便地用作temp的同义词。

最后一件事是从string中的数据重建参数temp