如何在 c++ 中读取输入字符串,忽略空格
How to read an input string in c++, ignoring spaces
我的任务是创建一个将一种测量单位转换为另一种测量单位的程序。因此,如果用户输入 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
。
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 移除前面有空格的前2个字符串
- 用于存储由空格分隔的字符串的 C++/C 数据结构
- 在字符串中插入空格
- C ++中的StringStream有助于使用向量从字符串中提取逗号分隔的整数,而不是空格分隔的整数,为什么?
- 使用另一个字符串从字符串中删除空格
- 我还可以添加什么来按空格或空格正确拆分C++字符串?
- C++ "noskipws"没有按预期工作,如何正确允许字符串中的空格?
- 在 c++ 中逐行阅读字符串,不要以空格停止
- std::regex:匹配由数字和空格组成的字符串,并提取数字.如何?
- 如何存储包含多个空格的字符串 c++
- 在特定位置为字符串添加空格
- 有没有办法在 c++ 中获取带有空格的完整字符串?
- C++完全复制要字符串的字符列表,而不会忽略多个空格
- Winsock2:当我尝试发送带有空格的字符串时,该函数在遇到空格时似乎停止发送
- 从没有空格的字符串中提取整数
- 用于拆分空格字符串的程序不起作用
- 解析C++中的完整(从头到尾)字符串,包括所有空格
- 反转字符串中单词的位置,而不更改 O(1) 空格限制中特殊字符的顺序
- 当我的 if 语句在字符串中找到空格时,在无限循环中切换