gpt4 book ai didi

c - 如何按城镇值排序将指向城市数组的指针插入城镇数组?

转载 作者:太空宇宙 更新时间:2023-11-04 03:13:01 25 4
gpt4 key购买 nike

我确定我在我的 insertTowns 函数中使用了错误的指针语法,因为当我尝试运行我的文件时,当我取消注释该函数中涉及指针的行时,我只会遇到段错误。我知道我在逻辑上正确地设置了功能,而不是在语法上。我在 insertTowns 的指针语法中做错了什么?

为简单起见,假设 FILE * infile 没有任何问题,并且数组已在单独的文件中正确分配。此外,length 被初始化为 0,然后从另一个 .c 文件中的 main 传递到 readFile 函数。所以这不是数组越界问题。

我在 YouTube 上观看了很多关于指针的视频(thenewboston 有一些不错的视频),看着 http://cslibrary.stanford.edu/106/和其他一些资源。

为了简单起见,我在下面提供了我的代码片段而不是整个程序,因为它只是一个语法问题:

typedef struct cityStruct { unsigned int zip; char * town; } city;
typedef struct zipTownsStruct {
int * zips; // indexs to main array cities sorted by zip
city * * towns; // pointers to main array cities sorted by town name
city * cities; // main array of cities in order from file not sorted
} zipTowns;

extern void insertTowns(zipTowns arrs, int * length) {
int j = (*length) - 1;
while (j >= 0 && ((strcmp(arrs.towns[j]->town, arrs.cities[*length].town)) > 0)) {
*arrs.towns[j + 1] = *arrs.towns[j];
j--;
}
*arrs.towns[j + 1] = arrs.cities[*length];
}

extern void readFile(zipTowns arrs, FILE * infile, int * length) {
char * zipCode;
char * town;
if((zipCode = malloc(sizeof(char) * 6)) == NULL) {
fprintf(stderr, "%s\n", strerror(errno));
exit(errno);
}
if((town = malloc(sizeof(char) * 26)) == NULL) {
fprintf(stderr, "%s\n", strerror(errno));
exit(errno);
}
while(fscanf(infile,"%s %s", zipCode, town) == 2) {
arrs.cities[*length].zip = atoi(zipCode);
arrs.cities[*length].town = town;
insertZips(arrs, length);
insertTowns(arrs, length);
(*length)++;
}
free(zipCode);
free(town);
}

最佳答案

extern void insertTowns(zipTowns arrs, int * length) {
int j = (*length) - 1;
while (j >= 0 && ((strcmp(arrs.towns[j]->town, arrs.cities[*length].town)) > 0)) {
*arrs.towns[j + 1] = *arrs.towns[j];
j--;
}
*arrs.towns[j + 1] = arrs.cities[*length];
}

如果 lengtharrs.towns 的条目数,您从 j = (*length) - 1 开始,所以 j+1 == *length*arrs.towns[j + 1] 以未定义的行为访问数组外。大概在arrs.cities[*length]中也是一样,复制总是同一个城市好像也很奇怪。

length 元素的数组中,有效索引是 0 .. length-1


警告

zipCode = malloc(sizeof(char) * 5)

允许存储最多 4 个字符的 zipcode 以放置结束空字符(在法国,zipcode 使用 5 个字符,您可能不是这种情况,但您没有提供足够的信息让我们知道)


很难多说因为你不给Minimal, Complete, and Verifiable example

关于c - 如何按城镇值排序将指向城市数组的指针插入城镇数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54583285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com