我是否错误地使用了fscanf?

时间:2016-09-16 18:16:56

标签: c file matrix scanf

我在C中为编码做了一些编码,遇到了一个奇怪的问题。我将以下内容保存在txt文件中:

11
1 1 0 1 0 0 0 1 0 0 0 
0 1 1 0 1 0 0 0 1 0 0 
0 0 1 1 0 1 0 0 0 1 0 
0 0 0 1 1 0 1 0 0 0 1 
1 0 0 0 1 1 0 1 0 0 0 
0 1 0 0 0 1 1 0 1 0 0 
0 0 1 0 0 0 1 1 0 1 0 
0 0 0 1 0 0 0 1 1 0 1 
1 0 0 0 1 0 0 0 1 1 0 
0 1 0 0 0 1 0 0 0 1 1 
1 0 1 0 0 0 1 0 0 0 1

它只是一个零和一的方阵,顶部的数字11是矩阵的维数。我使用以下代码片段阅读此文件:

void generateCNF(FILE* f, FILE* g){
    int n;
    fscanf(f,"%d",&n);
    int i,j;
    int A[n][n]; // A is where I store my matrix
    for(i=1;i<=n;i+=1){
        for(j=1;j<=n;j+=1){
            fscanf(f,"%d",&A[i][j]); 
            printf("%d ",A[i][j]); // I print out A while reading into it
        }
        printf("\n");
    }
    //...
}

这是printf生成的输出:

0 1 1 0 1 0 0 0 1 0 0 
0 0 1 1 0 1 0 0 0 1 0 
0 0 0 1 1 0 1 0 0 0 1 
1 0 0 0 1 1 0 1 0 0 0 
0 1 0 0 0 1 1 0 1 0 0 
0 0 1 0 0 0 1 1 0 1 0 
0 0 0 1 0 0 0 1 1 0 1 
1 0 0 0 1 0 0 0 1 1 0 
0 1 0 0 0 1 0 0 0 1 1 
1 0 1 0 0 0 1 0 44 0 1606415088

我不知道那些最后的条目是如何错误的。我尝试用文本编辑器中的矩阵打开文件,它看起来非常好,所以我怀疑fscanf(或者更确切地说,我使用它)有些不对劲。

我可以添加完整的C文件(大约90行),如果有必要帮助我,但我不想让这个帖子不必要地混乱。

3 个答案:

答案 0 :(得分:5)

您正在索引矩阵的界限。如果你没有崩溃,你可能会得到垃圾,因为你写的是你不拥有的记忆。 C中的数组和矩阵是零索引的,因此大小为n乘n矩阵的索引为0到n-1。

for(i=1;i<=n;i+=1){
    for(j=1;j<=n;j+=1){

应该是

for(i=0;i<n;i+=1){
    for(j=0;j<n;j+=1){

答案 1 :(得分:3)

数组索引基于零,它们从零到元素数减去一。

在您的情况下,他们从0转到n - 1(含)。这意味着循环应该是例如。

for(i=0;i<n;i+=1){

请注意i0开始,条件从i<=n更改为i<n

答案 2 :(得分:0)

替换你的循环代码
for(i=0;i<n;i++)
{
    for(j=0;j<n;j+=1)
    {
        fscanf(f,"%d",&A[i][j]); 
        printf("%d ",A[i][j]); // I print out A while reading into it
       }
        printf("\n");
}

查看循环开始和结束点。在c中,数组从索引0开始。