2016-05-14 80 views
1

程序只是讀取文件計數字符串及其長度。但字符串的計數器p給我一個錯誤的結果。如果我只是打印計數p,結果將是正確的,但如果我打印元素a [i] [1](它應該是p),它會給我一個錯誤的結果。對於在元件的示例的[0] [1] - 它打印12,在那裏它被認爲是1。c - 數組錯誤計數結果

int main(int argv,char* argc[]) { 

    FILE *f = fopen("d.txt","r"); 
    int a[700000][1]; 
    char str[120]; 
    int i=0,l,p=0,n; 
    while (fgets(str,120,f)) { 
     l=strlen(str)-1; 
     p++; 
     a[i][0]=l; 
     a[i][1]=p; 
     i++; 
    } 
    // if I printf("%d",p); result will be correct 
    n=i-1; 
    for (i=0;i<=3;i++) { 
     printf("%d\n",a[i][1]); //result - 12 6 4 8 
    } 

    close(f); 
    return(0); 
} 

d.txt

未有\ 0 一個\ 0 是\ 0 這裏\ 0

結果將是 - 4 2 4 4

+0

我們不能沒有你的輸入數據複製本。請按照指示出示您的[MCVE]。 –

+1

這是什麼:'int a [700000] [1];' ?? –

+0

int a [5] [1];看上去好些? –

回答

4

你的問題是這樣的一行:

int a[700000][1]; 

這定義了類型爲int的2維數組int,但第二維爲1,從而有效地生成1維數組。

後來,當您試圖訪問的元素數組中:

a[i][0]=l; 
    a[i][1]=p; 

的第一項任務是好的 - 它設置在內存中是整數遠離陣列的開始值。

但第二項任務不正確。指數超出第二維的極限1(0是第一個元素,1是第二個元素)。由於C沒有進行運行時間數組限制檢查,因此將其轉換爲將整數從數組的起始處設置爲i + 1整數。

如果你想有一個700000x2陣列,該聲明是這樣的:

int a[700000][2];