数组结果在while循环中是正确的,但在它之外被打破

时间:2016-07-14 22:05:01

标签: c arrays

我正在编写一个执行简单任务的程序;逐行读取文件,解析它,并将结果存储到数组中,其中结构为array [lineNumber] [lineElement]。在大多数情况下,除了我遇到的一个奇怪的问题外,它正在发挥作用。

在下面的代码中,对填充它的while循环外部数据的数组的任何访问只返回最后一个条目。无论lineNumber的键是什么,都会发生这种情况。基本上它就像覆盖一样,即使在while循环中它可以访问就好了。我认为只有两个项目可能是错误的我用粗体概述,虽然对于 char * processData [100]; ,它不应该是一个问题,因为它存储在一个声明的数组中在while循环之外(如果我记得正确的循环不应该有范围?),另一行** char ** processArray [100]; **,它可能是一个指针数组的双星,但只返回一个星形引入了一整堆错误,即前面提到的数组结构完全断开。

因此,简而言之,不是任何方式的C专家,并为这个问题耗尽我的资源,我想知道这里的C编码员是否可能有一些关于到底发生了什么的建议,以及我怎么能得到这个按照预期工作....如果我可以的话。

如前所述,代码。

#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {

    FILE *ifp;
    char line[80];
    int returnValue = 0;

    //Open file
    ifp = fopen("dataFile", "rt");

    if (ifp == NULL) {
        fprintf(stderr, "Can't open input file!\n");
        returnValue = 1;
    }

    int lineCounter = 0;
    char **processArray[100];

    while(fgets(line, 80, ifp) != NULL) {

        char *processData[100];

        char *p = strtok(line, " ,\n");

        int keyCounter = 0;

        while (p != NULL) {
            processData[keyCounter] = p;
            p = strtok(NULL, " ,\n");

            keyCounter++;
        }

        processArray[lineCounter] = processData;

        printf("%d\n", lineCounter);
        printf("Inside -> %s\n", processArray[0][0]);
        lineCounter++;
    }
    printf("Outside %s\n", processArray[0][0]);
    fclose(ifp);

    int i;
    int j;

    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4; j++) {
            printf("%d-%d  => %s\n ", i, j,  processArray[i][j]);
        }
    }

    return returnValue;
}

2 个答案:

答案 0 :(得分:2)

[几乎]所有内容都会在外部while循环中被覆盖,因此只剩下最后一个处理过的行。必须保留中间结果

我已经修复了程序,注释了bug。样式为#if 0 /* original code */ #else /* fixed code */ #endif

#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main(void)
{
    FILE *ifp;
    char line[80];
    int returnValue = 0;

    //Open file
    ifp = fopen("dataFile", "rt");

    if (ifp == NULL) {
            fprintf(stderr, "Can't open input file!\n");
            returnValue = 1;
    }

    int lineCounter = 0;
    char **processArray[100];

    // NOTE/BUG: things get lost on each iteration of this loop
    while(fgets(line, 80, ifp) != NULL) {
            char *processData[100];

            char *p = strtok(line, " ,\n");

            int keyCounter = 0;

            while (p != NULL) {
            // NOTE/BUG: p will get overwritten -- so we must save the string
#if 0
                    processData[keyCounter] = p;
#else
                    processData[keyCounter] = strdup(p);
#endif
                    p = strtok(NULL, " ,\n");

                    keyCounter++;
            }

            // NOTE/BUG: processData must be duplicated -- it is overwritten
            // on the outer loop
#if 0
            processArray[lineCounter] = processData;
#else
            char **pA = malloc(sizeof(char *) * keyCounter);
            processArray[lineCounter] = pA;
            for (int copyidx = 0;  copyidx < keyCounter;  ++copyidx)
                pA[copyidx] = processData[copyidx];
#endif

            printf("%d\n", lineCounter);
            printf("Inside -> %s\n", processArray[0][0]);
            lineCounter++;
    }
    printf("Outside %s\n", processArray[0][0]);
    fclose(ifp);

    int i;
    int j;

    for (i = 0; i < 4; i++) {
            for (j = 0; j < 4; j++) {
                    printf("%d-%d  => %s\n ", i, j,  processArray[i][j]);
            }
    }

    return returnValue;
}

答案 1 :(得分:1)

正在堆栈中分配

processData,并且在离开while循环后内存地址无效,无论您将其存储在processArray中。您需要从堆中分配(使用malloc或其他一些内存分配函数)