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
相关产品推荐
相关产品推荐

