错误检查尝试,我该如何解决?

时间:2019-07-13 00:28:02

标签: c struct visual-studio-code return-type

对于一项家庭作业,我的任务是向代码添加错误检查。我还剩下两个:一个我了解我需要编写错误检查的内容,但是无法使它正常工作,另一个我还没有找到要检查的内容。

我尝试更改read_edge的返回类型以允许使用return 0;在发现错误时结束函数,但这导致g.edges收到错误的类型。我还尝试在测试“ edge”结构上主调用read_edge之前设置错误检查,但这对捕获错误没有影响。

typedef int vertex;

typedef struct {
    vertex source;
    vertex target;
    float weight;
} edge;

typedef struct {
    int n;
    int m;
    vertex* vertices;
    edge* edges;
} graph;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
edge read_edge(FILE* file) {
    edge e;
        if (fscanf(file, "%d %d %f", &e.source, &e.target, &e.weight) != 3){
        printf("Error: Expected an Integer and/or Float\n");
        return 0;
    }
    fscanf(file, "%d %d %f", &e.source, &e.target, &e.weight);
    return e;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

这是main调用read_edge的部分:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    graph g = create_graph(n, m);

    for (int i = 0; i < m; i++) {
        // missing error check 
        g.edges[i] = read_edge(file);
    }

    printf("%d %d\n", g.n, g.m);

    return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

很显然,由于我尝试返回0,所以这将导致编译错误;返回类型为“ edge”,但我不确定如何使这种情况发生。

1 个答案:

答案 0 :(得分:1)

更改函数,使其返回int,并使用指向要填充的结构的指针作为参数。

此外,您不应致电fscanf()两次。第二个调用将尝试从文件中读取下一个结构,而不是重新读取测试结果时所读取的内容。

int read_edge(FILE* file, edge *e) {
    if (fscanf(file, "%d %d %f", e->source, e->target, e->weight) != 3){
        printf("Error: Expected two integers and float\n");
        return 0;
    }
    return 1;
}

在呼叫者中,而不是

e = read_edge(f);

您使用类似

int success = read_edge(f, &e);

所以另一个功能是:

for (int i = 0; i < m; i++) {
    int success = read_edge(file, &g.edges[i]);
    if (!success) {
        break;
    }
}