2011-08-14 5 views
-1

をスタックトレースを示すが、Netbeansの実行は、スタックトレースを出力C++プログラムが正常に、何も出力を構築していない、唯一正常にビルド

スタックトレース:

Frame  Function Args 
0022C694 7570EFA3 (00000108, 0000EA60, 00000000, 0022C7B8) 
.............. 
End of stack trace 

私は、ファイルの行ごとのチェックを読んでいますC++クラスの概念を使用している母音を持っている場合。

私はファイルを1行ずつ読み込んでテストし、C++クラスを使用せずに1行ずつファイルを正常に書き込むことができました。

私のコードを変更する必要があることを指摘してください。私はメモリ管理の問題があると思う。

ありがとうございました!

#include <cstdlib> 
#include<fstream> 
#include <iostream> 

using namespace std; 

class Password{ 
    private: 
     char *pwd; 
    public: 
     Password(const char*pwd){ 
      setPassword(pwd); 
     } 
     ~Password(){ 
      delete []pwd; 
     } 
     void setPassword(const char *pwd){ 
      delete []this->pwd; 
      if(pwd!=NULL){ 
       this->pwd=new char[strlen(pwd)+1]; 
       strcpy(this->pwd,pwd); 
      }else{ 
       this->pwd=NULL; 
       } 
     } 
     char *getPassword(){ 
      return this->pwd; 
     } 
     bool containsVowel(){ 
      int i,counter=0; 
      for(i=0;i<strlen(this->pwd);i++){ 
      if(this->pwd[i]== 'a' || 'e' || 'i' || 'o' || 'u') 
       counter++; 
      } 
      if (counter>0) 
       return true; 
      return false; 
     } 
}; 

int main(int argc, char** argv) { 
    ifstream infile("C:/Users/user/Desktop/say.in"); 
    ofstream outfile("C:/Users/user/Desktop/say.out"); 
    string str; 
    while (getline(infile,str)){ 
     const char *pwd=str.c_str(); 
     Password pwdObj(pwd); 
     if (pwdObj.containsVowel()==true){ 
    outfile<<"<"<<str<<"> is accpetable\r\n"; 
    } 

    } 
    infile.close(); 
    outfile.close(); 
    return 0; 
} 
+1

ここでは、ほとんどの場合、メモリ管理の問題があります。あなたは破壊時に 'delete'を実行しますが、' new'(あるいは 'NULL'へのポインタをinit!)しないでください。コピーコンストラクタ/ op ='はありません。 RAIIと3のルールについて読んでください。そして、 'std :: string'に何か問題がありますか? –

答えて

3

物事のカップルがありますする必要があります。最初の1つはPasswordpwdメンバが初期化されていないため、最初の呼び出しでsetPassword(...)が失敗する可能性があります。あなたはそう(混乱を避けるために改名引数)のようなあなたのコンストラクタで初期化することができます:

Password(const char *apwd) : pwd(0) { 
     setPassword(apwd); 
    } 

第二の問題は、あなたがそれを投稿したとしてcontainsVowelがかなり壊れているということです。変数iも初期化されておらず、ループがあるはずです。省略されているようです。 Delanが彼の返答で指摘した比較にも問題がある。

pwdメンバーをstd::stringにすることも考えられます。あなたの人生を幾分簡単にして、メモリ管理の面でも、母音を見つけることも---私はstr.find_first_of(...)を使って、すべての文字を自分自身で繰り返さずに母音を見つけることができると思います。

+0

パスワード(const char * pwd){ this-> pwd = NULL; setPassword(pwd); }問題が解決しました、ありがとうございます! –

+0

あなたはおそらく 'this->' everywhere ...を削除することによって、自分自身の視覚的な混乱を避けることができ、 'pwd'をゼロに初期化します! –

1
if(this->pwd[i]== 'a' || 'e' || 'i' || 'o' || 'u') 

if(this->pwd[i]== 'a' || this->pwd[i]== 'e' || this->pwd[i]== 'i' || this->pwd[i]== 'o' || this->pwd[i]== 'u') 
+0

あなたの意見を試した後も、smaeの問題は依然として続きます –

+0

これはあなたのコードの単なる問題です。おそらく他のものがあります。 –

+1

これは質問に対する答えではありませんが、確かに有効な観察であり、コードで修正されている必要があります。 –

0

そうした場合:this-> PWDがNULLである場合

 delete []this->pwd; 
     if(pwd!=NULL){ 
      this->pwd=new char[strlen(pwd)+1]; 

何が起こりますか?

関連する問題