以下是我正在处理的问题:
给定输入的文本行,打印时不带任何空格。
这是我尝试解决方案:
#include <iostream>
int main()
{
using namespace std;
std::string text;
cin >> text;
for(int i=0; i<text.size(); i++) {
if(text[i]==' ') {
text.erase(text.begin()+i);
}
}
cout << text <<"\n";
}
此代码打印字符串并在第一个空格处停止。我错过了什么?
答案 0 :(得分:1)
问题实际上有点含糊:“没有任何空间”, 你的意思是“没有任何空白区域”或“没有任何空间 字符“;表达式广泛用于两种含义。 (空格字符是空格,但它是一个标签,甚至是 换行。)
无论如何,std::cin >> text
永远不会将任何空白区域放入其中
text
;这是如何定义的。如果你想阅读
完整的一行,您需要std::getline
。而当你在
你的循环正确的轨道,你不测试角色
在您擦除的那个之后立即。这是一个经典问题
删除元素时;删除元素时,则不会
想要增加。
其余的,当然:我假设你这样做 运动:专业人士可能会写:
text.erase( std::remove( text.begin(), text.end(), ' ' ), text.end() );
(如果目标是,则使用std::remove_if
和功能对象
删除所有空格。)
最后, if 切换到使用std::isspace
:你不能
使用char
直接调用它,而不会有未定义的风险
行为。您必须将char
转换为unsigned char
第一
答案 1 :(得分:0)
来自cin >>
参考:http://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt2
如果满足下列条件之一,则提取将停止:找到空白字符(由
ctype<CharT>
facet确定)。不提取空白字符。 (...)
tl; dr - 使用cin >> text;
将在第一个空格处停止提取。你应该使用例如getline()
,如前所述。
#include <iostream>
int main() {
std::string text;
std::cin >> text;
std::cout << text << '\n';
}