C++ 代码在我的系统上运行良好,但在USACO上出现分段错误。什么问题?
这段代码我试图在UASCO上运行,不知道是什么问题,它的失败与分段错误有关。 帮我做这个 了解如何调试分段问题也会有所帮助。 有没有好的教程,可以给我的基础知识,并告诉我如何调试C++ 代码在我的系统上运行良好,但在USACO上出现分段错误。什么问题?,c++,C++,这段代码我试图在UASCO上运行,不知道是什么问题,它的失败与分段错误有关。 帮我做这个 了解如何调试分段问题也会有所帮助。 有没有好的教程,可以给我的基础知识,并告诉我如何调试 # include <iostream> # include <string> # include <fstream> using namespace std; struct member { string mainMem; int amount; int myAmount;
# 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;
}
}
}
}
#包括
#包括
#包括
使用名称空间std;
结构成员
{
字符串mainMem;
整数金额;
int myAmount;
内特诺夫姆;
字符串toGiveMem[10];
};
int main()
{
流式输出(“gift1.out”);
ifstream fin(“gift1.in”);
int totalMem;
成员allMem[totalMem];
字符串名;
fin>>totalMem;
对于(int i=0;i>allMem[i].mainMem;
allMem[i].myAmount=0;
}
而(!fin.eof())
{
fin>>名称;
对于(int i=0;i>allMem[i]。金额;
fin>>所有成员[i].noOfMem;
for(int j=0;j>allMem[i].toGiveMem[j];
}
}
}
//所有输入均已完成。
请看一下这些行:
int totalMem;
member allMem[totalMem];
string name;
fin>>totalMem;
声明数组时,什么是totalMem
我原以为这会显示为编译器警告。除了已经接受的答案之外:
无论何时读取文件,都必须确保读取成功,否则不能使用变量
错误代码:
int totalMembers;
fin >> totalMembers;
好代码:
int totalMembers;
if (fin >> totalMembers) {
// now totalMembers is guaranteed to be defined
}
此外,您不应该在循环中使用eof
函数。相反,在读取变量时使用上述检查。如果失败(返回false
),您可能已到达文件末尾,或者出现I/O错误。在这种情况下,您可以使用eof
或bad
来区分这些情况。您应该剪切并粘贴代码,此代码缺少一个右括号…更不用说它有点难看。谢谢,我只需要将语句重新排序为:int totalMem;string name;fin>>totalMem;成员allMem[totalMem];