C程序所有scanf行报格式参数过多错误问题排查
问题原因定位
- 函数参数误用:
scanf是标准输入(键盘)读取函数,官方定义的参数仅需格式控制串 + 对应变量地址,你额外传入的sizeof(xxx)、文件指针f属于多余参数,直接触发「格式参数过多」报错。
如果需要限制字符串输入长度避免溢出,正确写法是把长度写到格式符里,比如scanf("%30s", vacname)(假设vacname数组长度是31),不需要单独传sizeof参数。
- 函数参数误用:
fopen返回值未赋值:当前代码中fopen("vaccine.txt", "w");的返回值没有赋值给文件指针f,后续fprintf、fclose操作的是未初始化的野指针,会直接导致程序崩溃。
- 如果你原本的需求是从文件
vaccine.txt读取数据,还存在两个额外错误:读文件应该用fscanf而不是scanf,且fscanf也不需要传入sizeof参数;打开文件的模式"w"是只写模式,无法读取内容,需要改为"r"等可读模式。
- 如果你原本的需求是从文件
修正后的可运行代码(按「从键盘读入数据写入文件」的需求调整)
// 需提前定义对应变量,示例: // char vacname[50], code[50], country[50]; // int dosage, quantity; // float population; FILE* f; f = fopen("vaccine.txt", "w"); // 修复:把fopen返回值赋值给f // 建议增加文件判空逻辑:if(f == NULL) { perror("打开文件失败"); return 1; } for (int i = 0; i < 5; i++) { printf("\nName of vaccine %d: ", i + 1); scanf("%49s", vacname); // 去掉多余的sizeof和f,加长度限制避免溢出 printf("\tVaccine Code: "); scanf("%49s",code); printf("\tProducing Country: "); scanf("%49s", country); printf("\tDosage: "); scanf("%d", &dosage); printf("\tPopulation: "); scanf("%f", &population); printf("\tQuantity: "); scanf("%d", &quantity); fprintf(f, "%s\n%s\n%s\n%d\n%.2f\n%d\n", vacname, code, country, dosage, population, quantity); } fclose(f); printf("\nVaccine data successfully recorded!\n\n");
内容的提问来源于stack exchange,提问作者user16790547
相关产品推荐
相关产品推荐

