成功构建,但Netbeans运行输出堆栈跟踪
堆栈追踪:
Frame Function Args
0022C694 7570EFA3 (00000108, 0000EA60, 00000000, 0022C7B8)
..............
End of stack trace
我正逐行阅读一个文件,并检查它们是否有使用C ++类概念的元音。
我已经测试过逐行读取文件,并且在不使用C ++类的情况下逐行成功编写文件。
请指出我应该更改代码的位置。我猜存在内存管理问题。
非常感谢!
#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;
}
答案 0 :(得分:3)
有几件事。第一个是pwd
的{{1}}成员未初始化,这可能会导致Password
在第一次调用时失败。您可以像这样在构造函数中初始化(重命名参数以避免混淆):
setPassword(...)
第二个问题是 Password(const char *apwd) : pwd(0) {
setPassword(apwd);
}
在你发布它时已经完全破碎了。变量containsVowel
也没有初始化,我猜测应该有一个循环---看起来它已被省略了。此外,Delan在回复中也提到了比较问题。
您还可以考虑将i
成员设为std::string
。无论是在内存管理方面还是在寻找元音方面,它都会让你的生活变得更加轻松 - 我想你可以使用str.find_first_of(...)
找到元音而不用自己迭代所有的字符。
答案 1 :(得分: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' )
答案 2 :(得分:0)
如果你这样做:
delete []this->pwd;
if(pwd!=NULL){
this->pwd=new char[strlen(pwd)+1];
如果this-&gt; pwd为NULL,会发生什么?