2016-12-25 6 views
0

私のコードをデバッグするのに助けが必要です。私は多くのことを試しましたが、文字列から文字を削除できないようです。C++の文字列から文字を削除するにはどうすればよいですか?

std :: eraseの仕組みが完全に分かりません。文字を消去できるかどうかはわかりません。

#include <iostream> 
#include <string> 

using namespace std; 
int main(){ 

    string s; 
    char n; 
    cin >> s; 
    cin >> n; 

    for (int i = 0;i < s.length(); i++) { 
     s.erase (n[i]); 
    } 

    cout << s; 

    return 0; 

} 

EDIT:あまりにも曖昧です。私は意図した文字列ではなく配列から何かを削除しようとするという私の問題を認識しました。投稿された回答の助けを借りて。その下に添付された更新されたコードが、私が望むように動作します。あなたのお返事ありがとうございます!

#include <iostream> 
#include <string> 

using namespace std; 
int main(){ 

string s; 
char n; 
cin >> s; 
cin >> n; 

for (int i = 0; i < s.length(); i++) { 
    while (s[i] == n) { 
     s.erase(i, i); 
    } 
} 

cout << s; 

return 0; 

} 
+3

「n [i]」とはどういう意味ですか?このコードで意味をなさないし、あなたが意図したものがわからない – UnholySheep

+0

'n'に格納されている文字を' s'から削除したいようです。 'n'も' i'も配列ではないので、 'n [i]'という表現は不正です。メンバー 'erase()'は、文字をある位置から所定の長さ(デフォルトでは文字列の最後まで)で消去します。実際に 's'から' n'のインスタンスを削除したい場合は 'std :: remove()'を見てください。 –

+0

そのコードはコンパイルされません(https://ideone.com/3M01b4)。 [mcve]を投稿してください。 –

答えて

0

あなたがしようとしていることについての適切な記述が含まれていれば役立ちます。質問はやや曖昧ですが、あなたがしようとしているのであれば、文字列から指定された文字を削除しようとしていると推測します。

#include <iostream> 
#include <string> 

using namespace std; 
int main(){ 

    string s; 
    char n ; 

    cin >> s; 
    cin >> n; 
    for (int i = 0; i < s.length(); i++) { 
     if (s[i] == n) { 

      s.erase(i, 1); 

     }   
    } 

    cout << s; 

    return 0; 

} 
+1

's.length() - 1'は' s.length() 'でなければなりません。 –

3

は使用erase-remove idiom

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

int main() { 

    std::string s = "Hello World!"; 
    s.erase(std::remove(s.begin(), s.end(), 'l', s.end()); 
    std::cout << s << std::endl; 
    return 0; 
} 

二つの文に分け、それは次のようになります。

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

int main() { 

    std::string s = "Hello World!"; 
    auto it = std::remove(s.begin(), s.end(), 'l'); 
    s.erase(it, s.end()); 
    std::cout << s << std::endl; 
    return 0; 
} 
1

あなたはちょうどあなたが使用できる文字列から1つの文字を削除したい場合は、そのメソッドfindを使用して、文字列内の文字を検索します。例えば

auto pos = s.find(n); 
if (pos != std::string::npos) s.erase(pos, 1); 

それとも、ループを使用して文字列内の文字の出現をすべて消去したい場合は、あなたが書くことができますループに次のよう

std::string::size_type pos = 0; 

while (pos < s.size() && s[pos] != n) ++pos; 

if (pos != s.size()) s.erase(pos, 1); 

を使用することができます

for (std::string::size_type pos = 0; pos < s.size();) 
{ 
    if (s[pos] == n) s.erase(pos, 1); 
    else ++pos; 
} 
+1

これらのソリューションはすべて最悪の場合、2次の複雑さがあります。このアプローチは複雑であるため、 'st :: :: remove()'と 's.erase()'を組み合わせて使うほうがずっと良いです。 –

+1

@DietmarKühl質問の著者は、文字列とクラスメソッドでループを使用する方法を学ぶと確信しています。彼は標準アルゴリズムについてはまだ何も知らない。 –

関連する問題