C语言 2d数组-每一行被下一行覆盖



我正在从文件中读取。每当我读到"过渡"这个词时,我都试图将接下来的5个元素添加到2d数组中。我有一堆printf,我已经注释掉了,这表明我添加了正确的元素。然而,一旦我完成了从文件中读取,我循环检查我的2d数组值,它们都被最后一行的值覆盖了。

我的代码

State* allStates[1002];
State* currentState;
char* input = argv[1];
char* inputStr = argv[2];
int maxTrans = atoi(argv[3]);
int transCount = -1;
FILE* inputFile;
char* transition[maxTrans][5];  
inputFile = fopen(input, "r");
if (inputFile == 0)
{
    perror("Can't open filen");
    exit(-1);   
}
else
{
    char next[1000];
    //int counter = 0;
    while (fgets(next, 1000, inputFile) != NULL)
    {
        char *nextWord;
        nextWord = strtok_r(next, "t");
        if (strcmp(nextWord, "state") == 0)
        {
            //counter++;
            nextWord = strtok_r(NULL, "t");
            //puts(nextWord);
            int q = atoi(nextWord);
            nextWord = strtok_r(NULL, "n");
            //puts(nextWord);
            if (strcmp(nextWord, "accept") == 0)
            {
                State* newState = makeState(q, 1, 0, 0);    
                allStates[q] = newState;
            }
            else if (strcmp(nextWord, "reject") == 0)
            {
                State* newState = makeState(q, 0, 1, 0);    
                allStates[q] = newState;
            }
            else if (strcmp(nextWord, "start") == 0)
            {
                State* newState = makeState(q, 0, 0, 1);    
                allStates[q] = newState;
                currentState = newState;
            } 
            else    
            {
                State* newState = makeState(q, 0, 0, 0);    
                allStates[q] = newState;
            }           
        }
        if (strcmp(nextWord, "transition") == 0)
        {
            //printf("n");
            //setup 2d array of transitions
            transCount++;
            nextWord = strtok_r(NULL, "t");
            //puts(nextWord);
            transition[transCount][0] = nextWord;
            //printf("%c", *transition[transCount][0]);
            nextWord = strtok_r(NULL, "t");
            //puts(nextWord);
            transition[transCount][1] = nextWord;
            //printf("%c", *transition[transCount][1]);
            nextWord = strtok_r(NULL, "t");
            //puts(nextWord);
            transition[transCount][2] = nextWord;
            //printf("%c", *transition[transCount][2]);
            nextWord = strtok_r(NULL, "t");
            //puts(nextWord);
            transition[transCount][3] = nextWord;
            //printf("%c", *transition[transCount][3]);
            nextWord = strtok_r(NULL, "n");
            //puts(nextWord);
            transition[transCount][4] = nextWord;   
            //printf("%c", *transition[transCount][4]); 
        }
    }
}   
fclose(inputFile);
int u = 0;
int y = 0;
char m = 'm';
for (u; u < 12; u++)
{
    printf("n");
    for (y = 0; y < 5; y++)
    {
        //transition[u][y] = &m;
        printf("%c", *transition[u][y]);

    }
}

如果我正在读取的文件看起来像这样,

转换0 * 0 * R

转场0 1 1 1 L

过渡0 0 1 x R

我希望数组看起来像这样

0 x0xr

0141 l

001 xr

数组的值将改为

001 xr

001 xr

001 xr

我知道重写发生在每一行。例如:当我写到第2行值变成:

0141 l

0141 l

我真的不知道如何修复它。

问题是我错误地使用了strtok()。我接受了Dmitri的建议,并使用strdup()为新字符串分配内存,我得到了正确的结果。

nextWord = strtok(NULL, "t");
temp = strdup(nextWord);
transition[transCount][0] = temp;

最新更新