给定一条线,如何打印它没有任何空格?

时间:2014-07-04 14:34:35

标签: c++ spaces

以下是我正在处理的问题:

  

给定输入的文本行,打印时不带任何空格。

这是我尝试解决方案:

#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";
}

此代码打印字符串并在第一个空格处停止。我错过了什么?

2 个答案:

答案 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';
}