结构数组 - C值不好

时间:2017-04-02 11:39:30

标签: c arrays struct strtok

我在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循环中打印问题[0] .question元素,我得到“OK?”,但是如果我在while循环后打印相同的东西,我会得到“什么?”。 /> 我花了很多时间思考我可能做错了什么,但没有成功 谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

此:

char* answers[1024];

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

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

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

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

答案 1 :(得分:1)

在你的结构中,你有很多char指针,对于你所有的指针,你都要分配从strtok返回的指针值。您需要了解strtok返回的指针内容会随着每次调用strtok而随时间变化,并且您不应该存储这些指针以供将来使用。请参阅strtok的人。

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