2011-11-14 68 views
0

我不明白這裏的問題。我研究過它,它編譯得很好,但是當我運行該程序時,它給了我「調試斷言失敗!」錯誤和上面的解釋。獲取錯誤「表達式:字符串下標超出範圍」

#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; 
} 
+0

如果在遍歷它時修改對象,請非常小心。請注意,循環會跳過它擦除的每個字符 - 它將移動到下一個位置,跳過由於「擦除」操作而「滑入」當前字符的字符。 (這是'if'循環的一個糟糕的選擇,使用'while',如果你調用'erase'則不會增加'i'。) –

回答

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在評論中指出。)

+0

如果你給'string :: erase'一個數字參數,它將會被擦除到字符串的末尾。他應該使用'str.erase(i,1);' – Blastfurnace

+0

是的,你是正確的,修復我的答案......謝謝你指出。 – Mysticial

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; 
} 
+2

對不起,'<='也是不正確的。 '<'是正確的。 – Benoit