我有这段代码,它不能正常工作。这个函数与另一个函数相连接,在这里我请求一个城市和一个日期。然后,在确认文件中存在这两个函数之后,这个函数调用下面的新函数。
我知道我不能把一个字符串和一个整数进行比较,我知道可以相互转换,但我不知道怎么做,在这种情况下我是否能做到。id是整数,meteo_city_id是结构中存在的字符串。我在iffor条件的第二部分有这个问题。
同时,在同一个for中,我有i < 152。这是我必须使用的文件中存在的行数。但是,用户可以在文件中添加行,因此,在添加新的行之后,该代码将不再工作。那么,无论以后添加的行数是多少,我可以用什么来替换152,使循环for工作?
谢谢你的帮助。功能如下:

#define TAM_STR 100
typedef struct city_t{
char city_id[TAM_STR];
char city_name[TAM_STR];
char county_name[TAM_STR];
char district_name[TAM_STR];}    city_t;

typedef struct meteo_t{
char meteo_id[TAM_STR];
char meteo_city_id[TAM_STR];
char tempt_max[TAM_STR];
char tempt_min[TAM_STR];
char humidity[TAM_STR];
char pressure[TAM_STR];
char date[11];}   meteo_t;

city_t *read_meteo(const char *filename, size_t *len)
{
if(filename == NULL || len == NULL)
    return NULL;

FILE *fp = fopen(filename, "r");
if(fp == NULL)
{
    fprintf(stderr, "Could not open %s: %s\n", "meteo.csv", strerror(errno));
    return NULL;
}
meteo_t *arr = NULL, *tmp;
*len = 0;
char line[1024];

while(fgets(line, sizeof line, fp))
{
    tmp = realloc(arr, (*len + 1) * sizeof *arr);
    if(tmp == NULL)
    {
        fprintf(stderr, "could not parse the whole file %s\n", "meteorologia.csv");
        if(*len == 0)
        {
            free(arr);
            arr = NULL;
        }
        return arr;
    }
    arr = tmp;
    sscanf(line, "%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%s", (arr[*len].meteo_id), (arr[*len].meteo_city_id), (arr[*len].tempt_max), (arr[*len].tempt_min), (arr[*len].humidity), (arr[*len].preassure), (arr[*len].date));
    (*len)++;
}
fclose(fp);
if(*len == 0)
{
    free(arr);
    arr = NULL;
}
return arr;
}

void search_meteo_by_city_by_date(meteo_t *meteo, size_t len, const char *city, const int id, const char *date){

bool find = false;

if(meteo == NULL || city == NULL || id == NULL || date == NULL) {
    printf("ERROR");
}

for(size_t i = 0; i < 152; ++i) {
    if (strcasecmp(date, meteo[i].date) == 0 && id == meteo[i].meteo_city_id) {
        find = true;
        printf("Information for: %s in %s \nMaximum Temperature: %s ºC\nMinimum Temperature: %s ºC\nHumidity: %s \nPressure: %s hPa\n\n\n", city, date, meteo[i].tempt_max, meteo[i].tempt_min, meteo[i].humidity, meteo[i].preassure);
    }
}
if(find == false) {
    printf("No results were found for: %s\n", city);
}
}
void search_date_by_city() {

size_t cities_len;
city_t *cities = read_cities("cities.csv", &cities_len);
char local[100];
char date[100];

// error
if(cities == NULL) {
    printf("ERROR");
}

printf("City: ");
scanf("%[^\n]%*c", local);

int id = search_for_city_by_name(cities, &cities_len, cidade);

if(id == -1) {
    printf("That city doesn't exist\n");
    return;
}

printf("Date: ");
scanf("%[^\n]%*c", date);

size_t meteo_len;
meteo_t *meteo = read_meteo("meteo.csv", &meteo_len);

if(meteo == NULL) {
    printf("ERROR");
}

search_meteo_by_city_by_date(meteo, &meteo_len, local, id, date);

}
文件cities.csv有152行和4列,例如
id,city,county,district

文件meteo.csv有152行和7个克隆,例如
meteo_id,meteo_city_id,tempt_max,tempt_min,humidity,pressure,date

最佳答案

函数:search_meteo_by_city_by_date()期望参数len包含实际条目数,但是,在调用该函数的地方,传递的是包含实际条目数的变量的地址。
建议替换此项:

search_meteo_by_city_by_date(meteo, &meteo_len, local, id, date);

有了这个:
search_meteo_by_city_by_date(meteo, meteo_len, local, id, date);

它传递的是metro_len的内容,而不是metro_len的地址
然后替换这个:
for(size_t i = 0; i < 152; ++i)

具有
for(size_t i = 0; i < len; ++i)

10-05 18:16