hash_map在c ++ stl中崩溃

时间:2009-12-26 14:21:54

标签: c++

我在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);
}

`

2 个答案:

答案 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来识别崩溃的确切行和该点的变量值。