Получение ошибки «Выражение: строковый индекс вне диапазона» - PullRequest
0 голосов
/ 14 ноября 2011

Я не понимаю проблемы здесь. Я исследовал его, он прекрасно компилируется, но когда я запускаю программу, она выдает «Отладочное утверждение не удалось!» ошибка и приведенное выше объяснение.

#include <iostream>
#include <string>
using namespace std;


bool checkVowel(char ch)
{
 switch(ch)
 {
     case 'a':
     case 'A':
     case 'e':
     case 'E':
     case 'i':
     case 'I':
     case 'o':
     case 'O':
     case 'u':
     case 'U':
          return true;
     default:
          return false;
 }}
int main()
{
string str;
char ch;
cout<<"Please enter a string, all vowels will be removed: ";
cin >> str;

for (int i=0;i=str.length();i++)
{

 if (checkVowel(str[i]))
     {
        str=str.erase(i);
 }}

cout << str;
}

Ответы [ 2 ]

4 голосов
/ 14 ноября 2011

Одна ошибка здесь:

i=str.length()

должно быть:

i < str.length()

В вашем исходном коде i=str.length() всегда будет возвращать true, если строка не пустая. Таким образом, эффект состоит в том, что вы будете обгонять строку.

Кроме того, вы не хотите увеличивать индекс, когда вы найдете гласный, или пропустите следующий символ:

for (int i = 0; i < str.length(); )
{
    if (checkVowel(str[i]))
    {
        str.erase(i,1);
    }else{
        i++;
    }
}

Последнее: str=str.erase(i); не обязательно, достаточно str.erase(i,1);. (Вам понадобится второй параметр как 1, как указано в комментариях.)

1 голос
/ 14 ноября 2011

если условие неверное, оно должно быть for (int i=0;i <= str.length();i++)

В качестве альтернативы вы можете использовать STL remove_if

remove_if(str.begin(), str.end(), checkVowel);

Полная программа будет.

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
bool checkVowel(char ch){
    switch(ch){
        case 'a':
        case 'A':
        case 'e':
        case 'E':
        case 'i':
        case 'I':
        case 'o':
        case 'O':
        case 'u':
        case 'U':
            return true;
        default:
            return false;
    }
}
int main(){
    string str;
    char ch;
    cout << "Please enter a string, all vowels will be removed: ";
    cin >> str;
    remove_if(str.begin(), str.end(), checkVowel);
    cout << str;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...