You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C程序所有scanf行报格式参数过多错误问题排查

问题原因定位

    1. 函数参数误用:scanf是标准输入(键盘)读取函数,官方定义的参数仅需格式控制串 + 对应变量地址,你额外传入的sizeof(xxx)、文件指针f属于多余参数,直接触发「格式参数过多」报错。
      如果需要限制字符串输入长度避免溢出,正确写法是把长度写到格式符里,比如scanf("%30s", vacname)(假设vacname数组长度是31),不需要单独传sizeof参数。
    1. fopen返回值未赋值:当前代码中fopen("vaccine.txt", "w");的返回值没有赋值给文件指针f,后续fprintf、fclose操作的是未初始化的野指针,会直接导致程序崩溃。
    1. 如果你原本的需求是从文件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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 18:36:03