我在Java编码方面比较有经验,但我是C ++的新手。 我已经编写了以下C ++代码作为我在this url重现的USACO培训问题的解决方案
这段代码对我来说很好看。 然而,它在给出的样本测试用例中崩溃了。 在隔离错误时,我发现如果第二次for循环没有运行到最后一次迭代(我的意思是在示例测试用例中,n = 5,所以我只运行循环直到i = 3而不是i = 4) ,然后它不会崩溃(并产生预期的输出)。 也许错误在别的地方,我无法察觉。
欢迎任何想法。 提前致谢。 请原谅我稍微笨拙的代码格式(这是我的第一篇论坛帖子)。包含的文件是stdlib.h,stdio.h和hash_map.h `
#include <stdlib.h>
#include <stdio.h>
#include <hash_map.h>
struct eqstr
{
bool operator()(const char* s1, const char* s2) const
{
return strcmp(s1, s2) == 0;
}
};
int main(int argc, char** argv) {
FILE *fin = fopen("gift1.in", "r");
FILE *fout = fopen("gift1.out", "w");
hash_map<const char*, int, hash<const char*>, eqstr> table;
int n;
fscanf(fin,"%d",&n);
char name[15];
char people[10][15];
for(int i = 0; i < n; i++){
fscanf(fin,"%s",name);
strcpy(people[i],name);
table[people[i]] = 0;
}//ifor
for(int i = 0; i < n; i++){
fscanf(fin,"%s",name);
int money;
fscanf(fin,"%d",&money);
int friends;
fscanf(fin,"%d",&friends);
char fname[15];
int amt = money/friends;
for(int j = 0; j < friends; j++){
fscanf(fin,"%s",fname);
table[fname] = table[fname] + amt;
}//jfor
table[name] = table[name] - friends*amt;
}//ifor
for(int i = 0; i < n; i++)
fprintf(fout,"%s %d\n",people[i],table[people[i]]);
return (EXIT_SUCCESS);
}
`
答案 0 :(得分:4)
它崩溃的原因是vick给了0个朋友的钱,导致以下代码行除以零例外:int amt = money/friends;
当这个人有0个朋友时,你应该加入一些特殊的逻辑来处理这个案子,所以给你0美元。
正如其他评论中所述,您应该使用一些stl类(字符串,iostream等)来帮助清理代码。
编辑:添加了输入数据,因此问题和答案会更有意义
5
dave
laura
owen
vick
amr
dave
200 3
laura
owen
vick
owen
500 1
dave
amr
150 2
vick
owen
laura
0 2
amr
vick
vick
0 0
答案 1 :(得分:0)
我建议使用GDB来查找这些错误。这些也发生在我身上。
使用-g标志编译,然后使用gdb a.out(可执行文件)。现在输入run来运行程序。程序崩溃后,您可以使用backtrace来识别崩溃的确切行和该点的变量值。