0

Visual C++ 2010 は、「式: 文字列の添字が範囲外です」と言い続けます。「inStringP.length()」の長さよりも長いループを実行していると考えたため、for ループの条件テストで整数から 1 または 2 を加算および減算しましたが、これは成功しません。グーグルは今日もいつもの天才的な自分を感じていません.....

#include <iostream>
#include <cstdlib>
#include <string>
#include "stdAfx.h"
using namespace std;

string removeChar(string inStringP){
   string temp;
   for(int i=0;i<inStringP.length()-1;i++){
      if(inStringP[i]!='p'){
         temp[i]=inStringP[i];
      }
   }
   return temp;
}

int main(){
   string sample = "Peter picks a peck of pickled peppers";
   cout<<removeChar(sample)<<endl;

   system("PAUSE");
   return EXIT_SUCCESS;
}
4

5 に答える 5

2

アプリケーションがクラッシュするのは、以下のステートメントが に要素を割り当てないためです。tempアクセスtemp[0]未定義の動作です。

string temp;

removeChar 関数内で使用する場合tempは、const 参照を inStringP に渡すことをお勧めします。

string removeChar(const string& inStringP){
}

こうすることで、removeChar 関数に入るときに inStringP にコピーを作成する必要がなくなります。

より良い方法は、 erase-remove イディオムに従うことです:

試す:

string removeChar(string inStringP)
{
    return inStringP.erase(std::remove(sample.begin(), sample.end(), 'p'), sample.end());
}
于 2013-04-29T07:35:04.653 に答える
1

resize temp使用する前に

string temp;

temp.resize(inStringP.size());

最初に実際のサイズがわからない場合は、次のことがappendできpush_backますoperator+=

temp.append(1, inStringP[i]);

or

temp.push_back(inStringP[i]);

or

temp += inStringP[i];
于 2013-04-29T07:31:27.410 に答える
0

string.erase() を使用してみてください。

http://www.cplusplus.com/reference/string/string/erase/

反復子バージョンでは、文字を削除できます...反復子を使用して文字列を検索し、イテレータを引数として受け入れるererase関数を使用して削除します

編集: billz の回答を参照してください...とてもいいです!

于 2013-04-29T07:35:12.993 に答える
0

私がお勧めします;

string removeChar(string inStringP){
   string temp;
   int len = inStringP.length();
   for(int i = 0;i < len;i++){
      if(inStringP[i] != 'p'){
        temp.push_back(inStringP[i]);
      }
   }
   return temp;
}

あなたのロジックはコンパイル時エラーを出しますが、それは実行時エラーです。コードは実際には次のように機能します。

string temp;
    temp[0] = 'P';
    temp[1] = 'e';
    temp[2] = 't';
    temp[3] = 'e';
    temp[4] = 'r';
    temp[5] = ' ';
    //s[6] = 'p';
    temp[7] = 'i';

これは範囲外エラーです。

于 2013-04-29T07:50:13.240 に答える
0

を使用std::stringすると、算術演算子も使用できます。

あなたはこのようなことをすることができます、

   for(int i=0;i<=inStringP.length();i++)
   {
      if(inStringP[i]!='p')
      {
         temp += inStringP[i];
         cout<<temp<<endl;
      }
   }

あなたのコードを試してみましg++ 4.6.3たが、エラーは発生しませんでした。ただし、ループtempの最後に空白がありました。for

temp[i] = inString[i]、コンパイラはまだサイズを持っていませんtemp

また、ifortempinStringP Suppose を同じものを使用すると、キャラクターにいると +1eがスキップされます。の対応する場所はそのまま残ります。if blockitemp

また、string.length()以下を除く文字列の長さを返します\0

于 2013-04-29T07:52:38.990 に答える