首页 文章

结构数组 - C值不好

提问于
浏览
1

我在C中面临一个非常有趣的问题所以我有一个看起来像这样的结构:

struct Question {
    int year;
    char* month;
    char* day;
    char* hour;
    char* minute;
    char* second;
    char* question;
    int answerCount;
    char* answers[1024];
} questions[100];

在那里,我正在初始化一组名为问题的问题结构,大小为100 .
所以我想从一个看起来像这样的文件中填充该数组:

2017 04 01 12 38 00 OK? 2 NO NO
2017 04 01 14 15 00 WHAT? 4 YES YES YES YES

结构:年月日小时分钟第二个问题答案答案

我正在处理这样的文件:

...
int id = 0;
int j;

char line[2048];
while ( (fgets(line, sizeof(line), fp)) != NULL) {


        char* p = strtok(line, " ");
        char* tokens[1024];
        char* token;

        int i = 0;
        int counter = 0;

        while((p != NULL)) {
            switch(counter) {
                case 0: questions[id].year = atoi(p); break; // year
                case 1: questions[id].month = p; break; // month
                case 2: questions[id].day = p; break; // day
                case 3: questions[id].hour =p; break; // hour
                case 4: questions[id].minute = p; break; // minute
                case 5: questions[id].second = p; break; // seconds
                case 6: questions[id].question = p; break; // question
                case 7: 
                questions[id].answerCount = atoi(p);
                int qcount = atoi(p);
                int k;
                int l = j;
                //printf("count : %d", qcount);
                for (k = 0; k < qcount; ++k) {
                    p = strtok(NULL, " ");
                    ++l;
                    questions[id].answers[k] = p;
                }
                break;
                default: break;
            }
            p = strtok(NULL, " ");
            ++counter;
        }
        ++id;

    }
    fclose(fp);
...

之后,如果我在while循环中printf问题[0] .question元素,我得到"OK?",但是如果我在while循环后打印相同的东西,我得到"WHAT?" .
我花了很多时间思考我可能做错什么,但没有成功 .
谢谢你的帮助 .

2 回答

  • 1

    在您的结构中,您有许多char指针,对于所有这些指针,您将分配从 strtok 返回的指针值 . 您需要了解 strtok 返回的指针内容将在每次调用 strtok 时超时,并且您不应该存储这些指针以供将来使用 . 请参阅strtok的人 .

    您需要将结构中的 char * 更改为 char 数组或为那些 char * 分配内存,然后将指针的内容复制到 strtok 返回给它 . 否则,您最终可能会从程序中获得奇怪的行为 .

  • 2

    这个:

    char* answers[1024];
    

    是一个包含1024个字符串指针的数组,但不包含这些字符串的任何存储空间 . 所以当你这样做时:

    questions[id].answers[k] = p;
    

    您没有复制答案,只是指定了一个指针 . 由于 p 最终是一个指向 line 内某处的指针,它只在循环开始之前分配一次,所以每次循环时都会覆盖 line 中的字符串 . 所以 answers 的指示物正在被修改 .

    您可以将 answers 更改为char的2D数组,在这种情况下,每个答案的最大长度将受到限制,或者使用 strdup() 或类似为每个答案分配内存,并在最后使用 free() .

相关问题