我正在阅读带有坐标,城市名称和国家名称的位置文件。目前我只是在测试是否可以在我的数组中存储每行的第一个元素。休耕是我正在读取的文件的示例:
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
将字符串复制到此新缓冲区中。您必须对state
和country
字段执行相同的操作。
此外,您的data
结构并不是真正的链表。你真的刚刚创建了自己的准向量结构。真正的链表具有数据成员以及指向结构本身的指针。我建议你对链表实现做一些研究。