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

How to read an input string in c++, ignoring spaces

本文关键字:字符串 空格 输入 读取 c++      更新时间:2023-10-16

我的任务是创建一个将一种测量单位转换为另一种测量单位的程序。因此,如果用户输入 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
}

我的代码可以在输入双精度质量值之前忽略空格,以及在输入字符串的第一部分之前忽略空格。但是我不知道如何让我的程序将"短吨"读作"短吨"(无论单词之间的空格数如何(,以便我可以进行字符串比较并根据需要转换质量值。提前感谢您的帮助,请不要讨厌我,我正处于学习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,但这是另一个问题。

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,它只接受单个字符作为参数,并返回一个当且仅当字符不是空格时才为 true 的bool

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

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