我在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行),如果有必要帮助我,但我不想让这个帖子不必要地混乱。
答案 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){
请注意i
从0
开始,条件从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开始。