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

C语言使用fscanf读取配置文件后打印输出错误问题求助

问题根因

你的代码存在多个核心错误,共同导致了读取输出异常:

  • 字符指针未分配可写内存:Database_name、Username 是未初始化的野指针,没有指向合法的可写内存空间,fscanf 向这两个地址写入数据触发未定义行为,是输出异常的主要原因。
  • 格式串与配置文件格式不匹配:配置文件的键值对格式为键 = 值(等号两侧有空格、单键值对占一行),但你的fscanf格式串写为Host=%s,没有匹配等号两侧的空格和换行符,会导致匹配读取失败。
  • 缺少异常判断逻辑:未判断fopen是否打开文件成功、未判断fscanf实际成功读取的参数数量,出现异常时无法及时感知。
  • 输出未加换行符:printf 没有加\n换行符时,输出内容会留在标准输出缓冲区,不会实时打印到终端,也可能造成无输出的假象。

修复后的可运行代码

#include <stdio.h>

int main() {
    // 改为固定长度数组,避免手动管理内存的野指针问题
    char Host_ip[256];
    char Database_name[64];
    char Username[64];
    int listen_port;

    FILE *myfile = fopen("Coin_Converter.config", "r");
    // 增加文件打开失败判断
    if (myfile == NULL) {
        perror("打开配置文件失败");
        return 1;
    }

    // 调整格式串,匹配等号两侧的空格,格式串中写空格可以匹配任意空白字符(空格、换行、制表符)
    int read_cnt = fscanf(myfile, " Host = %s Database = %s Username = %s listenport = %d", 
                          Host_ip, Database_name, Username, &listen_port);
    fclose(myfile);

    // 判断是否成功读取了4个参数
    if (read_cnt != 4) {
        printf("配置文件格式错误,成功读取参数数量:%d\n", read_cnt);
        return 1;
    }

    // 输出加换行符,刷新缓冲区保证正常打印
    printf("Host = %s\n", Host_ip);
    printf("Username= %s\n", Username);
    printf("Database= %s\n", Database_name);
    printf("listenport = %d\n", listen_port);

    return 0;
}

补充说明

如果坚持要用字符指针实现,需要在调用fscanf前给指针分配足够的内存,示例如下:

char *Database_name = malloc(64);
char *Username = malloc(64);
// 用完后记得释放内存
free(Database_name);
free(Username);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:06:02