c - 数组

时间:2016-05-14 15:36:24

标签: c

程序只读取文件计数字符串及其长度。但是字符串的计数器p给了我错误的结果。如果我只打印计数p,结果将是正确的,但如果我打印元素a [i] [1](应该是p),它会给我一个错误的结果。对于元素a [0] [1]中的示例 - 它打印12,其应该是1。

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

1 个答案:

答案 0 :(得分:4)

你的问题就在这一行:

int a[700000][1];

这定义了一个类型为 int 的二维数组,但第二个维度为1,从而有效地生成一维数组。

稍后,当您尝试访问数组中的元素时:

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

第一个赋值很好 - 它将内存中的值设置为远离数组开头的 i 整数。

但第二项任务不正确。索引 1 超出第二个维度限制1(0是第一个元素,1是第二个元素)。由于C不进行运行时数组限制检查,因此将其转换为设置一个远离数组开头的 i + 1 整数的元素。

如果你想要一个700000x2数组,声明将如下所示:

    int a[700000][2];