使用加倍方案在 C 中设置数组值的正确方法



我正在阅读带有坐标,城市名称和国家名称的位置文件。目前我只是在测试是否可以在我的数组中存储每行的第一个元素。休耕是我正在读取的文件的示例:

Durban, South Africa
29 53 S
30 53 E  

我遇到的麻烦是,当我尝试将每行的第一个元素存储在数组中时,数组中的每个元素都会存储相同的值。到目前为止,我的代码是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "kml.h"
#define LEN 128
struct quard_t {
        char *city;
        char *state;
        char *country;
        int longitude;
        int latitude;
};
struct data_t {
        int nval;
        int max;
        struct quard_t *data;
};
enum {INIT = 1, GROW = 2};
int main(int argc, char **argv)
{
        char buf[LEN];
        char *str;
        int cnt = 0;
        FILE *in = fopen(argv[1], "r") ;
        struct data_t *data = malloc(sizeof(struct data_t));
        data->nval = INIT;
        data->max = INIT;
        data->data = NULL;
        while (fgets(buf, LEN, in)) {
                if (data->nval > data->max){
                        data->data = realloc(data->data, GROW * data->max *sizeof(struct quard_t));
                        data->max = GROW * data->max;
                }
                else if (data->data == NULL)
                        data->data = malloc(INIT * sizeof(struct quard_t));
                str = strtok(buf, " ");
                data->data[cnt].city = str;
                cnt++;
        }
        int i = 0;
        for ( ; i < cnt; i++ ){
               printf("%d: %sn", i, data->data[i].city);
        }
        fclose(in);
        return 0;
}

休耕是我得到的输出,数字是数组的索引,之后的所有内容都是存储在数组中的内容:

190: 30
191: 30
192: 30
193: 30
194: 30

当您为city赋值时:

data->data[cnt].city = str;

您所做的只是分配一个指针,而不是当前存储在str中的实际数据。因此,当您稍后覆盖str时,city指向 str 的最新值。要解决此问题,您需要在为quard_t结构分配空间时为city分配空间。然后使用 strcpy 将字符串复制到此新缓冲区中。您必须对statecountry字段执行相同的操作。

此外,您的data结构并不是真正的链表。你真的刚刚创建了自己的准向量结构。真正的链表具有数据成员以及指向结构本身的指针。我建议你对链表实现做一些研究。

相关内容

  • 没有找到相关文章

最新更新