我在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循环后打印相同的东西,我会得到“什么?”。 /> 我花了很多时间思考我可能做错了什么,但没有成功 谢谢你的帮助。
答案 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
返回的内容中它。否则,您最终可能会从您的程序中获得奇怪的行为。