Fscanf 打印所有内容,但退出程序,代码为 1 在 C 中

Fscanf prints everything but exits program with code 1 in C

提问人:Azizbek Sattorov 提问时间:11/2/2023 更新时间:11/2/2023 访问量:51

问:

我有这个函数,它以这种格式读取一些字符串:

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;
}

我对此感到非常困惑,因为它可以正确打印所有内容,但由于某种原因程序失败。请帮帮我。

c 指针 struct malloc scanf

评论

5赞 Barmar 11/2/2023
您以前从未初始化过。Nsizeof(info_t) * N
3赞 Barmar 11/2/2023
将行移动到行之前。N=info_t* cities_info
1赞 Barmar 11/2/2023
如果它从文件中读取它,为什么会将其作为参数?allocate_info()N
1赞 Barmar 11/2/2023
返回前会倒带吗?如果没有,则需要在开始之前倒带。或者它应该只是使用而不是阅读本身。read_number_of_citites()fptrallocate_info()Ntmp_flights
1赞 Chris 11/2/2023
您检查了一次的返回值,但第二次没有检查。你应该养成每次都这样做的习惯。fscanf

答:

0赞 Azizbek Sattorov 11/2/2023 #1

在调用函数之前,我必须初始化N。

2赞 Chris 11/2/2023 #2

在初始化函数之前在函数中使用变量会调用未定义的行为,因为 的值在使用它时是不确定的。NmainN

如果在 () 上使用警告进行编译,则会看到如下所示的警告,以及其他警告。-Wall -Wextra

warning: variable 'N' is uninitialized when used here [-Wuninitialized]

如果你用它进行编译,就会被视为编译错误,并且必须在你首先运行程序之前得到修复。-Wall -Wextra -Werror

您还会看到有关忽略 的返回值的警告,并被迫修复该问题。fscanf-Werror