我有一个函数,它可以读取这种格式的字符串:
2
伦敦柏林220 1.5
伦敦米兰280 2.5
...
同样的东西应该再读一遍。
2是字符串的个数。为此,我有以下函数:
void allocate_info(FILE* fptr, info_t* cities_info, int N){
int tmp_flights;
int i = 0;
while(fscanf(fptr, "%d", &tmp_flights) == 1){
printf("%d\n", tmp_flights); // this print!!!
char tmp_departure[LENGTH], tmp_arrival[LENGTH];
int tmp_price;
float tmp_duration;
for(int i = 0; i < tmp_flights; i++){
fscanf(fptr, "%s %s %d %f", tmp_departure, tmp_arrival, &tmp_price, &tmp_duration);
strcpy(cities_info[i].departure, tmp_departure);
strcpy(cities_info[i].arrival, tmp_arrival);
cities_info[i].price = tmp_price;
cities_info[i].duration = tmp_duration;
}
}
}
字符串
“this print!”实际上打印了所有的数字,但在最后程序失败(错误1)。这是我的主要功能:
int main(void) {
FILE* fptr = fopen("D:/ap2/lab02ex01/file.txt", "r");
int N;
info_t* cities_info = (info_t*)malloc(sizeof(info_t) * N);
N = read_number_of_cities(fptr); // some other function
allocate_info(fptr, cities_info, N); // ERROR HERE?!?
return 0;
}
型
我很困惑,因为它打印一切正确,但程序由于某种原因失败。请帮助我。
2条答案
按热度按时间wb1gzix01#
在初始化
main
函数之前,在函数中使用变量N
是调用undefined behaviour,因为N
的值在使用时是不确定的。如果在(
-Wall -Wextra
)上编译时有警告,您可能会看到类似以下的警告。字符串
如果你用
-Wall -Wextra -Werror
编译,这将被视为一个编译错误,并且在你可以首先运行程序之前必须被修复。你也会看到关于忽略
fscanf
的返回值的警告,并且-Werror
已经被迫修复了这个问题。yx2lnoni2#
我必须在调用函数之前初始化N。