2016-05-30 15 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 ':それはいいえ... – 3442

+0

あなたの思い出させるためにks。 – fgksgf

答えて

4

編集:

それがエラーをスローんだから、なぜ本当の問題でした。 コンテナの範囲にないインデックスにアクセスすると、std :: out_of_range例外がスローされます。

コメントに記載されているように、問題はwhile(str.find(' ')>=0)にあります。 string::findは何も見つからない場合はstring::nposを返します。 string::npos-1と定義されていますが、size_t型であるため、0より小さくすることはできません。代わりに、その型でループするため、最大の符号なし整数です。

4294967295、またはシステム上のsize_tタイプの最大値とコンパイルフラグを使用します。戻る問題while(str.find(' ')>=0)

、あなたが不可能な str[string::npos]にアクセスしようとするため std::out_of_range例外を取得し、最終的にループを停止、決してので str.findのリターンは常に、正の値になります言ったように。

「より良い」しばらくは、次のようになります。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

関連する問題