2016-05-14 49 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];