0

我正在编写代码来从边列表中创建一个矩阵。

然而,当我运行上述代码时,我得到了一个不在输入数据中的“幻影边缘”,这继续搞砸了我的程序的其余部分。边是矩阵中的 9,2,或元素代码形式的 8,1。

矩阵中的所有元素都预先初始化为 0。

这是与矩阵有关的输入数据:

1 2
1 8
2 8
3 5
3 1
4 5
4 6
5 2
5 9
6 4
6 8
7 4

7 10
8 4
8 6
9 4
9 5
10 7
10 3

以下是处理输入的函数:

void displayMatrix(int **matrix, int numberVertices){                           //function displays the matrix

        int i, j;

        for(i=0; i<numberVertices; i++)                                         //go through eveyr element
        {
                for(j=0; j<numberVertices; j++)
                {
                        printf("%d ", matrix[i][j]);                            //print element
                }
                printf("\n");
        }

        printf("\n\n");
}


void inputMatrix(FILE *fp, int ** matrix)                                       //file places value 1 into matrix if edge exists for the adjacency matrix
{
        int e1, e2;

        while(!feof(fp))                                                        //continue to the end of the file
        {
                fscanf(fp, "%d %d", &e1, &e2);                                  //get pairs
                e1 = e1 - 1;                                                    //adjust the edges for array use
                e2 = e2 - 1;
                matrix[e1][e2] = 1;                                             //place value 1 into appropriate location in adjacency matrix
        }

        fclose(fp);                                                             //close the file connection
}

0 1 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0 0
1 0 0 0 1 0 0 0 0 0
0 0 0 0 1 1 0 0 0 0
0 1 0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 1 0 0
0 0 0 1 0 0 0 0 0 1
0 0 0 1 0 1 0 0 0 0
0 *1 0 1 1 0 0 0 0 0
0 0 1 0 0 0 1 0 0 0

*不应该存在的条目,不在输入数据中

4

3 回答 3

2

问题是您循环的时间比必要的多,导致fscanf在第一次转换之前失败,因此离开了e1e2就像它们从先前的读取中一样。事实证明,最后一个条目已e1设置为10e23因此e1变为9e2变为2,从而导致您的幻像边缘

这个额外循环的原因是因为您的循环条件没有按照您的想法执行。feof检查是否设置了文件结束标志,并且只能在尝试读取文件末尾时设置。由于您在读取之前检查文件结尾,因此直到下一次迭代您才真正了解它,因此您循环了额外的时间。正确的校正非常简单;继续直到fscanf结果EOF

    while (fscanf(fp, "%d %d", &e1, &e2) != EOF)
    {
            matrix[e1 - 1][e2 - 1] = 1;                  
    }
于 2012-09-17T05:39:18.400 回答
1

正如评论中所指出的,您不是在测试fscanf.

特别是,您在 read 之后还没有到达文件末尾10 3,可能是因为遇到了换行符。

但是,在接下来的时间里fscanf将返回零。然后从这些值(未读取)中减去 1 以获得9 2.

您可以通过执行以下操作确保读取了两个整数:

if( 2 != fscanf(fp, "%d %d", &e1, &e2) ) break;
于 2012-09-17T05:39:44.490 回答
0

你可以试试这个:

fscanf(fp, "%d %d\n", &e1, &e2);

当你完成最后两位数时,还有一位\n,循环必须继续,这会很麻烦

于 2012-09-17T05:58:53.537 回答