我无法从文件中读取输入。每次我的代码达到strncpy时,我的代码都会中断,我无法找出原因。代码似乎在set name函数处破解。
fstream& AmaProduct::load(std::fstream& file){
char s[7];
char* n;
n = new char[7];
double p;
bool t;
int q;
int nn;
file.open("amaPrd.txt");
if (file.is_open()){
file.ignore(2);
file.getline(s,',');
cout << s;
sku(s);
file.ignore();
file.getline(n,',');
name(n);
file.ignore();
file >> p;
price(p);
file.ignore();
file >> t;
taxed(t);
file.ignore();
file >> q;
file.ignore();
quantity(q);
file.getline(unit_, ',');
file.ignore();
file >> nn;
qtyNeeded(nn);
}
file.close();
return file;
}
这是在这里设置的:
void Product::sku(char* sku){
strncpy(sku_,sku,7);
sku_[7]=0;
}
void Product::price(double price){
price_=price;
}
void Product::name(char* name){
delete[] name_;
name_= new char[strlen(name)+1];
strcpy(name_,name);
}
void Product::taxed(bool tax){
taxed_=tax;
}
void Product::quantity(int q){
quantity_=q;
}
void Product::qtyNeeded(int n){
qtyNeeded_=n;
sku被宣布
char sku_[8]
我已经在这方面工作了好几个小时但尚未找到解决方案。
答案 0 :(得分:0)
很抱歉我之前的回答显然不正确。
分段错误意味着您的程序正在尝试访问不属于它的内存位置。换句话说,您正在编写或读取尚未(正确)初始化或超出范围的指针(以及此处不太可能的其他几个选项)。
你写道它在strncpy崩溃了,它的唯一引用是在sku函数中。您没有“设置名称”功能,但在“名称”功能中有一个strcpy调用。注意strncpy和strcpy之间的区别。
您的函数Product :: sku(..)使用strncpy复制到sku_,但不清楚您在何处声明它以及它是否在范围内或者在Product :: sku(..)运行时已初始化。主要功能在AmaProduct命名空间(或类)中,而其他功能在Product中。这是故意的吗? sku_声明了哪个命名空间?
Product :: name(char * name)函数调用strcpy,它假定name是一个以零结尾的字符串。你确定它是零终止的吗?如果没有,它将继续写入并抛出段错误。为file.getline()添加最大字符数可能也是明智之举。最大数量应与目标缓冲区的大小相对应。
此外,将函数命名为与变量相同被认为是不明智的。拥有清晰且有意义的名称可以更容易地查看和调试代码的逻辑。
最后,请参阅http://www.cprogramming.com/debugging/segfaults.html以获取有关调试的更多帮助。