代码在我的系统上正常运行但在USACO上出现了分段错误。问题是什么?

时间:2014-06-28 05:31:37

标签: c++

这个代码我试图在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;
            }
        }
    }
}

2 个答案:

答案 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错误。在这种情况下,您可以使用eofbad来区分这些情况。