2017-04-02 72 views
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 

结构: 年月日时分秒问题answercount回答

我处理这样的文件:

... 
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); 
... 

之后,如果我的printf在while循环的问题[0]。提问元素,我得到的,但是如果我打印出“OK?” while循环之后的同样的东西,我得到“什么?”。
我花了很多时间思考我可能会做错什么,但没有成功。
感谢您的帮助。

+0

所以你期望字符串“OK?”存储在某个地方以供以后打印。哪里? –

+0

那么在问题[0] .question。我在这里进行分配:questions [id] .question = p; – Corner

+0

提问[0] .question是一个指针。它不能存储字符串,它只能指向其他地方存储的字符串。 –

回答

1

在你的结构中,你有很多字符指针,对于你指定的所有指针指针,从strtok返回指针值。您需要明白,strtok返回的指针内容将随着每次调用strtok而加班,并且您不应该存储这些指针以备将来使用。请参阅strtok的人。

你需要在你的结构要么改变char *char阵列或分配存储器的char *,然后复制指针的内容通过strtok它返回。否则,你最终可能会从你的程序中获得奇怪的行为。

+0

哦..谢谢你的回复!管理解决它,并在这里了解真正的问题。谢谢先生! – Corner

+0

最受欢迎! :) – Jay

2

此:

char* answers[1024]; 

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

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

你没有复制答案,只是给它指定一个指针。由于p最终是指向line中的某个指针,该指针在循环开始前仅分配一次,因此每次循环都覆盖line中的字符串。所以你的answers的对象正在被修改。

你可以要么改变answers是炭的2D阵列,在这种情况下,每个答案的最大长度将被限制,或者使用strdup()或类似于用于每个答案分配内存,和free()它在末端。

+0

他的问题是关于打印问题[0]。问题和你的答案是关于“question.answers”。虽然,我同意你有一个有效的观点。 ;) – Jay

+0

噢谢谢你,但这不是我的原始问题。感谢您的建议,但我改变了这一点。 – Corner