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

C语言中fopen()函数参数传递报错问题求助

问题解决:fopen参数错误及代码修正

核心错误分析

  • fopen参数类型不匹配:你用了单引号包裹的'r',这是字符常量(在C中本质是int类型),但fopen的第二个参数要求是字符串指针(const char*),必须用双引号包裹的字符串字面量"r"。
  • sscanf参数错误:sscanf(str, "%d", *number);里的*number是对指针的解引用,而sscanf需要的是存储整数的内存地址,直接传number即可(因为number本身就是指向目标整数的指针)。

修正后的完整代码示例

#include <stdio.h>
#include <stdlib.h>

// 函数定义:filename是文件名,number是存储结果的指针
void read_first_line(char *filename, int *number) {
    // 修正fopen的第二个参数为字符串"r"
    FILE *fp = fopen(filename, "r");
    // 必须检查文件是否成功打开,避免空指针操作
    if (fp == NULL) {
        perror("Failed to open file");
        exit(EXIT_FAILURE);
    }

    char str[6]; // 5位数字 + 换行符/字符串结束符,长度6足够
    // 检查fgets是否读取成功
    if (fgets(str, 6, fp) == NULL) {
        perror("Failed to read line");
        fclose(fp);
        exit(EXIT_FAILURE);
    }

    // 修正sscanf的参数,直接传number指针
    if (sscanf(str, "%d", number) != 1) {
        fprintf(stderr, "Failed to convert string to integer\n");
        fclose(fp);
        exit(EXIT_FAILURE);
    }

    // 用完文件记得关闭
    fclose(fp);
}

额外新手提示

  1. 永远要检查fopen的返回值:如果文件不存在、权限不足等情况,fopen会返回NULL,直接操作空指针会导致程序崩溃。
  2. fgets读取的内容会包含换行符(如果行长度小于缓冲区),但sscanf的%d格式会自动忽略换行符和空白字符,不影响转换。
  3. 用完文件后必须调用fclose释放资源,避免资源泄漏。

内容的提问来源于stack exchange,提问作者shari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:57:10