2011-03-15 18 views
0

なぜ私はstring.eraseでstring.findを呼び出すことができないように:str.erase(str.find(a[1]),str.size())? 編集:コードはどのようにstring.eraseとstring.findを使用しますか?

#include "stdafx.h" 
#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

// html tags 
string tags[5]={"<!--...-->","<!DOCTYPE>","<a>","<abbr>","<acronym>"}; 
// 

//check if string exists 
int boolStringExists(string a, string b) 
{ 
    if(a.find(b)>0) 
    { 
     return 1; 
    } 
    if(a.find(b)<=0) 
    { 
     return 0; 
    } 

} 
//erase tag from string a 
void eraseTags(string a,string b[]) 
{ 

    for(int i=0; i<5;i++) 
    { 
     int x=(boolStringExists(a,b[i])); 
     while (x>0) 
     { 
      a.erase(a.find(b[i]),b[i].size()); 
      x=(boolStringExists(a,b[i])); 
     } 
    } 
} 
int _tmain(int argc, _TCHAR* argv[]) 
{  
    fstream file; 
    file.open("h:\\a.htm"); 
    string k,m; 



    while(getline(file, k)) 
     m += k ; 


    eraseTags(m,tags); 


    return 0; 
} 

を追加しましたが、このメッセージを表示します。「このアプリケーションはより多くの情報については、アプリケーションのサポートチーム珍しいway.Please接触して、それを終了するランタイムを要求しました。」 https://ideone.com/8wibR

EDIT:あなたの完全なソースコードがb[1]があるかどうかをチェックするために失敗したその呼び出しと間違って何もない

+0

思いますなぜ?エラーがある場合は、関連するコードと共に投稿してください。理想的には、エラーをコンパイル、実行、再現する最小のコード例です。 –

答えて

1

#include <iostream> 
#include <string> 
int main() 
{ 
     std::string str = "Hello, world!"; 
     std::string a = "wwwwww"; 
     str.erase(str.find(a[1]), str.size()); 
     std::cout << str << '\n'; 
} 

テストランを(a[1]が存在し、少なくとも一度strに発見されたと仮定した場合)実際にはstrにあります。 boolStringExists()は、a.find(b)がゼロより大きい場合は1を返し、にbが見つからない場合に返されるstd::string::nposの値が0より大きい場合、戻り値はstd::string::nposです。そのままあなたのロジックの残りの部分を維持しながら

はこれを修正するには、あなたがstr.find後に来るすべてのものを消去したいようだ

//check if string exists 
bool boolStringExists(string a, string b) 
{ 
    return a.find(b) != string::npos; 
} 
+0

ありがとうございました。 –

1

にその機能を変更する([1])。その場合、2番目の引数を省略できます。この例では

#include <iostream> 
#include <string> 

int main(int argc, char *argv[]) { 
     std::string str = "Hello, world!"; 
     std::string needle = "o,"; 
     str.erase(str.find(needle)); 
     std::cout << str << "\n"; 
} 

私はneedleの代わりa[1]を使用しますが、原理は同じです。

3

文字列が見つからない場合、findstring::nposを返し、コードが機能せず、実行時エラーが発生します。これはエラーになります参照してください:https://ideone.com/NEhqn

だから、より良い本を書く:

size_t pos = str.find(a[1]); 
if (pos != std::string::npos) 
    str.erase(pos); //str.size() is not needed! 

さて、これはエラーを与えるものではありません:あなたは、これは動作しないことをhttps://ideone.com/IF2Hy

関連する問題