2016-05-30 47 views
-2

我想删除字符串中的空格,但是当我运行我的程序并进入“hello world”时,它没有跟我说话。它崩溃,这表明:为什么我无法删除字符串的空间?

enter image description here

#include <bits/stdc++.h> 
using namespace std; 

int main() 
{ 
    string str; 
    getline(cin,str); 
    int space; 
    while(str.find(' ')>=0) {//something wrong happened in the loop 
     space = str.find(' '); 
     str.erase(space,1); 
    } 
    cout<<str<<endl; 
    return 0; 
} 

我很困惑极了,因为我不知道为什么我的字符串是出于range.So如何解决?提前致谢。

+0

我想知道为什么我的程序崩溃而不是如何删除空间 – fgksgf

+1

'#include ':这是一个不 - no ... – 3442

+0

我看,比ks为您提醒。 – fgksgf

回答

4

编辑:

所以,真正的问题是,为什么它抛出一个错误。 当访问不在容器范围内的索引时,会引发std :: out_of_range异常。

正如在评论中提到的问题在于while(str.find(' ')>=0)。当它找不到任何东西时,string::find返回string::nposstring::npos定义为-1,但由于它是size_t类型,所以它不能小于0.因此,该值是最大可能的无符号整数,因为它的类型是“循环”的。

所以它会是4294967295,或者是系统上size_t类型的最大值以及编译标志的最大值。

回到问题while(str.find(' ')>=0),作为所述的str.find回报率将始终是正值,所以你永远不会停止循环,最后得到一个std::out_of_range异常,因为您尝试访问str[string::npos]这是不可能的。

的“更好”,而随后将是:while(str.find(' ') != string::npos)

初步答案:。

还有另一种方式来做到这一点使用std::remove算法它提供了一系列为std ::擦除

#include <iostream>  
#include <string> 
#include <algorithm> 

int main() 
{ 
    std::string str = "this is a line"; 

    std::cout << "before: " << str << std::endl; 

    str.erase(std::remove(str.begin(), str.end(), ' '), str.end()); 

    std::cout << "after: " << str << std::endl; 
} 
+0

谢谢,但我仍然想知道为什么我的程序崩溃而不是如何删除空间。 – fgksgf

+0

str.find总是返回值> = 0 当它没有找到一个字符时,它返回'string :: npos',所以你的代码应该是'while(str.find('')!= string :: npos )' – vianney

+0

那么,这是非常友善的:)。但string :: npos的值是-1。这就是为什么我很困惑。 – fgksgf