我有这段代码,它不能正常工作。这个函数与另一个函数相连接,在这里我请求一个城市和一个日期。然后,在确认文件中存在这两个函数之后,这个函数调用下面的新函数。
我知道我不能把一个字符串和一个整数进行比较,我知道可以相互转换,但我不知道怎么做,在这种情况下我是否能做到。id
是整数,meteo_city_id
是结构中存在的字符串。我在if
中for
条件的第二部分有这个问题。
同时,在同一个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)