问题描述给的很详细,很棒!我把你的代码全部复制下来放到vs里跑了一遍,看到你在读取和保存药品信息时出现了问题。读取文件时,您使用了fscanf函数来解析每一行的数据并存储到你定义的med.medicine_array数组中,但是你并没有正确处理字符串结尾的空字符'\0',导致后续输出可能会出现意外的结果。(这是第一个bug) 然后,在保存药品信息到文件时,您使用了fprintf函数将药品信息写入文件,但是在格式化字符串中没有指定浮点数的精度,这可能导致输出的价格有多余的零。(这是第二个bug),好了,夜已深,授之以渔,也授之以鱼,我把代码给你按照我描述的修改了一下: #include #include #include #define MAX_SIZE 100 // 定义药品结构体 typedef struct { char drug_name[100]; int drug_code; float drug_price; int stock; } Medicine; // 定义药品库存结构体 typedef struct { int size; Medicine medicine_array[MAX_SIZE]; } MedicineInventory; // 从文件中读取药品信息 void read_medicine_file(MedicineInventory *med) { FILE *fp; char filename[] = "medicine.txt"; char line[200]; fp = fopen(filename, "r"); if (fp == NULL) { printf("无法打开文件:%s\n", filename); exit(1); } // 初始化药品库存大小为0 med->size = 0; // 使用一个临时变量来存储解析后的数据 Medicine temp_med; while (fgets(line, sizeof(line), fp)) { // 使用sscanf解析每一行的数据并存储到临时药品结构体中 sscanf(line, "%[^,],%d,%f,%d", temp_med.drug_name, &temp_med.drug_code, &temp_med.drug_price, &temp_med.stock); // 给药品名称字符串末尾添加空字符'\0',以确保它是一个有效的C字符串 temp_med.drug_name[strlen(temp_med.drug_name)] = '\0'; // 将临时药品结构体的数据复制到药品库存结构体数组中 med->medicine_array[med->size] = temp_med; // 更新药品库存大小 med->size++; } fclose(fp); } // 显示药品信息 void show_medicine(MedicineInventory med) { int i; printf("药品名称\t\t\t药品编码\t\t药品价格\t\t库存\n"); printf("----------------------------------------------------------\n"); for (i = 0; i < med.size; i++) { // 使用%.2f作为格式字符串来打印价格,限制小数位数为两位 printf("%s\t\t\t%d\t\t\t%.2f\t\t\t%d\n", med.medicine_array[i].drug_name, med.medicine_array[i].drug_code, med.medicine_array[i].drug_price, med.medicine_array[i].stock); } } int main() { MedicineInventory med; read_medicine_file(&med); show_medicine(med); return 0; } 希望可以帮到你