二维数组 - 每行被下一行覆盖
2d Array - Each Row being Overwritten by Next
我正在从文件中读入。每当我读到 'transition' 这个词时,我都会尝试将接下来出现的 5 个元素添加到二维数组中。我有一堆 printf,我已将其注释掉,表明我正在添加正确的元素。但是,一旦我完成从文件中的读取,我循环检查我的二维数组值,它们都已被最后一行的值覆盖。
这是我的代码
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 file\n");
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 x 0 x R
转换 0 1 4 1 L
转换 0 0 1 x R
我希望数组看起来像这样
0x0xR
0141L
001xR
相反,数组的值将是
001xR
001xR
001xR
我知道覆盖发生在每一行。即:当我写入第 2 行时,值变为:
0141L
0141L
虽然我真的不知道如何修复它。
问题是我对 strtok() 的错误使用。我听取了 Dmitri 的建议并使用 strdup() 为新字符串分配内存,我得到了正确的结果。
nextWord = strtok(NULL, "\t");
temp = strdup(nextWord);
transition[transCount][0] = temp;
我正在从文件中读入。每当我读到 'transition' 这个词时,我都会尝试将接下来出现的 5 个元素添加到二维数组中。我有一堆 printf,我已将其注释掉,表明我正在添加正确的元素。但是,一旦我完成从文件中的读取,我循环检查我的二维数组值,它们都已被最后一行的值覆盖。
这是我的代码
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 file\n");
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 x 0 x R
转换 0 1 4 1 L
转换 0 0 1 x R
我希望数组看起来像这样
0x0xR
0141L
001xR
相反,数组的值将是
001xR
001xR
001xR
我知道覆盖发生在每一行。即:当我写入第 2 行时,值变为:
0141L
0141L
虽然我真的不知道如何修复它。
问题是我对 strtok() 的错误使用。我听取了 Dmitri 的建议并使用 strdup() 为新字符串分配内存,我得到了正确的结果。
nextWord = strtok(NULL, "\t");
temp = strdup(nextWord);
transition[transCount][0] = temp;