这个代码我试图在UASCO上运行,不知道它的问题是它的分段故障失败了。 帮助我 此外,了解如何调试分段问题应该会有所帮助。 是否有任何好的教程可以给我基础知识并告诉我如何调试。
# include <iostream>
# include <string>
# include <fstream>
using namespace std;
struct member
{
string mainMem;
int amount;
int myAmount;
int noOfMem;
string toGiveMem[10];
};
int main()
{
ofstream fout ("gift1.out");
ifstream fin ("gift1.in");
int totalMem;
member allMem[totalMem];
string name;
fin>>totalMem;
for( int i = 0; i<totalMem; i++)
{
fin>>allMem[i].mainMem;
allMem[i].myAmount = 0;
}
while(!fin.eof())
{
fin>>name;
for( int i = 0; i<totalMem; i++)
{
if(name.compare(allMem[i].mainMem)==0)
{
fin>>allMem[i].amount;
fin>>allMem[i].noOfMem;
for(int j = 0; j< allMem[i].noOfMem; j++)
fin>>allMem[i].toGiveMem[j];
}
}
}
// all input taken.
cout<<" Do processing."<<endl;
for(int i = 0; i< totalMem; i++)
{
int x =0;
if(allMem[i].noOfMem != 0)
x = allMem[i].amount/allMem[i].noOfMem;
allMem[i].myAmount += allMem[i].amount- (x*allMem[i].noOfMem);
for(int j = 0; j <allMem[i].noOfMem; j++)
{
for(int k = 0; k< totalMem; k++)
{
if(allMem[i].toGiveMem[j].compare(allMem[k].mainMem) == 0)
{
allMem[k].myAmount += x;
break;
}
}
}
}
答案 0 :(得分:1)
看看这些内容:
int totalMem;
member allMem[totalMem];
string name;
fin>>totalMem;
声明数组时totalMem
是什么?
我原本以为这会显示为编译器警告。
答案 1 :(得分:0)
除了已经接受的答案:
每当您从文件中读取时,都必须确保读取成功。否则你不能使用变量。
错误代码:
int totalMembers;
fin >> totalMembers;
好的代码:
int totalMembers;
if (fin >> totalMembers) {
// now totalMembers is guaranteed to be defined
}
此外,您不应该在循环中使用eof
函数。相反,在读入变量时使用上述检查。如果失败(返回false
),则表示您已到达文件末尾或发生I / O错误。在这种情况下,您可以使用eof
或bad
来区分这些情况。