0

これがこれまでの私のプログラムです。コンパイルはしますが、スタックして最後の部分でクラッシュします。ユーザーの文字列入力を繰り返し、文字列に含まれる不適切な単語を "****" に置き換えたいと考えています。ほとんどの場合、私のエラーは find_Poop_inSentence にあります。「デバッグ アサーションに失敗しました。ベクトル添え字が範囲外です」

void find_Poop_inSentence(vector<string> & v1, vector<string> & v2, string sub);

int main()
{
cout << "Howdy partner, tell me some words you don't take kindly to.\n";
vector<string>bad_words;
string word;

while (cin >> word)
{
    cin.ignore();
    bad_words.push_back(word);
    if (word == "exit")
        break;

}
cout << "Ok partner, got it!\n";
cout << "Now say something and I'll repeat it back to you. Don't worry, I'll bleep out the words that you don't like.\n";

word = "";
vector<string> random_sentence; 
while (cin >> word)
{
    cin.ignore();
    random_sentence.push_back(word);
    if (cin.get() == '\n')
        break;

}

find_Poop_inSentence(bad_words, random_sentence, "****");

cout << "You said: ";
for (unsigned int i = 0; i < random_sentence.size(); ++i) {
    cout << ' ' << random_sentence[i];
}
system("Pause");
return 0;
}

void find_Poop_inSentence(vector<string> & v1, vector<string> & v2, string sub) {
int iterOne;
int iterTwo = 0;
int iteratorMax = v2.size();


for (iterOne = 0; iterOne < iteratorMax; iterTwo++) {

    if (v1[iterOne] == v2[iterTwo]) {
        v2[iterTwo] == sub;
    }
    if (iterTwo == iteratorMax ) {
        iterOne++;
        iterTwo = 0;
    }

  }
}
4

2 に答える 2

0

友人の Ivan Drago のおかげで、これを解決することができました。

void find_Poop_inSentence(vector<string> & v1, vector<string> & v2, string sub);

int main()
{
cout << "Howdy partner, tell me some words you don't take kindly to.\n";
vector<string>bad_words;
string word;

while (cin >> word)
{
    //cin.ignore();
    bad_words.push_back(word);
    if (word == "exit")
        break;

}
cout << "Ok partner, got it!\n";
cout << "Now say something and I'll repeat it back to you. Don't worry, I'll bleep out the words that you don't like.\n";
cout << "Push enter twice when done.\n";

word = "";
vector<string> random_sentence;
while (cin >> word)
{
    //cin.ignore();
    random_sentence.push_back(word);
    if (cin.get() == '\n')
        break;

}

find_Poop_inSentence(bad_words, random_sentence, "****");

cout << "You said: ";
for (unsigned int i = 0; i < random_sentence.size(); ++i) {
    cout << ' ' << random_sentence[i];
}
system("Pause");
return 0;
}

void find_Poop_inSentence(vector<string> & v1, vector<string> & v2, string sub) {

for (unsigned int i = 0; i < v1.size(); i++) {

    for (unsigned int j = 0; j < v2.size(); j++) {
        if (v1[i] == v2[j]) {
            v2[j] = sub;
        }

    }
  }

}
于 2016-06-08T12:59:34.970 に答える
0

疑問符の付いた部分だけでなく、さらに多くの作業を行う必要があります。置換部分を実装できたとしても、コードは機能しません。

find(bad_words.begin(), bad_words.end(), say_back) != bad_words.end())

find()最初の 2 つのパラメーター、開始イテレーター値と終了イテレーター値で指定されたシーケンスを検索します。これらはあなたのbad_words. find()3 番目のパラメーターで指定された値の最初の出現をチェックし、最初に見つかった値を参照する反復子を返すend()か、値が見つからなかった場合に返します。

したがって、bad_words に「Fudge」が含まれていて、「Fudge」と入力した場合say_backfind()はそれを見つけます。

ただし、「Definitely Fudge」と入力した場合はsay_backfind()もちろん見つかりません。あなたのどれにもbad_words「間違いなくファッジ」が含まれていないからです。find()完全一致を検索します。

そのため、「文字列で見つかった悪い単語を置き換える」ことを望んでいた場合say_back、これは機能しません。

bad_wordsの anyを置き換えることを考える前にsay_back、正しいアルゴリズムを理解する必要があります。say_backで個々の単語を検索し、 で個々の単語を確認する必要がありますbad_words

検索アルゴリズムを正しく実装できるようになるまで、見つけたものをどのように置き換えるかを考え出すことは、いわばbad_words、カートを馬の前に置くことです。

まずこれを理解する必要があります。必要に応じて、いつでもゴム製のアヒルと話すことができます

于 2016-06-07T23:27:59.810 に答える