获取错误“表达式:字符串下标超出范围”

时间:2011-11-14 05:58:24

标签: c++ visual-studio-2010

我不明白这里的问题。我研究过它,它编译得很好但是当我运行程序时它给了我“调试断言失败!”错误和上述解释。

#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 个答案:

答案 0 :(得分:4)

这里有一个错误:

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 :(得分:1)

条件错误,应为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;
}