2016-09-16 70 views
0

我正在做一些C編碼的任務,並遇到了一個奇怪的問題。我保存在一個txt文件內容如下:我是否錯誤地使用了fscanf?

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行),但我不希望混亂不必要的帖子。

+2

提示:總是檢查任何scanf函數的返回值。它會在某個時刻爲你節省很多頭痛。 – hyde

+3

對不起,我改了標題。 「fscanf」按文件記錄。 –

+0

@WeatherVane已批准。 –

回答

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){ 
3

數組索引基於零,他們從零到零下元素一個數。

在你的情況下,他們從0n - 1(含)。這意味着循環應該是例如

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

注意i開始於0,條件是從i<=n變爲i<n

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開始。

相關問題