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

标签 c++ string cin

我的任务是创建一个程序,将一种测量单位转换为另一种测量单位。因此,如果用户输入 5 千克,它会将其转换为等值的磅数。要求规定用户输入必须全部在一行中读取,并且输入中任何位置的任意数量的空格都不能消除功能。我的问题是:如果用户在实际的双“质量”值之间输入一堆空格,然后在测量单位(例如“短吨”)中的不同单词之间输入空格,我该如何消除空格以便它读起来只是“shorttonnes”? 到目前为止我的代码是:

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

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

我的代码可以在输入双倍质量值之前忽略空格,并在输入字符串的第一部分之前忽略空格。但我不知道如何让我的程序将“short tonnes”读作“shorttonnes”(不管单词之间的空格数),以便我可以进行字符串比较并根据需要转换质量值。预先感谢您的帮助,请不要讨厌我,我正处于学习 C++ 的第一周。

最佳答案

再次向您道歉。编辑后,我认为我最初的评论是正确的。按照其他人的推荐使用 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,但这是另一个问题。

关于c++ - 如何在 C++ 中读取输入字符串,忽略空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50361660/

相关文章:

c++ - 使用 while 循环创建对象

c++ - 我们如何区分使用重载的 [] 运算符来获取和设置?

c++ - 是否可以将结构与条件语句完全相同的字符串转换为可以读取和操作的语句?

c++ - 构造函数调用顺序与组合

c++ - 来自 stdin 的 Cin 是一行的结尾

c++ - 当我调用我的函数时,while 循环会跳过一个步骤

C++ out-proc COM 服务器在 VB.NET 中重写并跨 C++ EXE 共享

java - 有没有一种干净简单的方法可以使 Java OS 中的文件路径字符串不可知?

c - 如何用C更好的方式将字符串插入字符串?

java - 使用 StringTokenizer 生成单词对