C语言读取file.txt时如何将多分支if语句替换为switch实现
switch替换多分支if实现方案
你的counter是按行计数的状态变量,天然匹配switch的整数分支判断逻辑,替换时只需将原来的counter == x判断改为switch的case分支即可,同时修正原有代码的逻辑缺陷,保证可以正常读取多条数据存入链表。
完整调整后代码
#include <stdio.h> #include <stdlib.h> #include <string.h> // 修正原有结构体next指针的类型错误,原struct node不存在,应为struct info typedef struct info { char name[99]; char age[99]; char sex[99]; struct info *next; }info_t; void load(info_t **head){ FILE *file; char buffer[255]; int counter = 0; info_t *help = NULL; info_t *current = NULL; // 增加文件打开失败判断 file = fopen("file.txt", "r"); if (file == NULL) { perror("file.txt打开失败"); return; } while(fgets(buffer, sizeof(buffer), file) != NULL){ // 替换多分支if为switch switch(counter) { case 0: help = malloc(sizeof(info_t)); if (help == NULL) { perror("内存分配失败"); fclose(file); return; } // 去掉fgets读取到的末尾换行符 buffer[strcspn(buffer, "\n")] = '\0'; strcpy(help->name, buffer); break; case 1: buffer[strcspn(buffer, "\n")] = '\0'; strcpy(help->age, buffer); break; case 2: buffer[strcspn(buffer, "\n")] = '\0'; strcpy(help->sex, buffer); help->next = NULL; // 将读取完成的结构体插入链表 if (*head == NULL) { *head = help; current = help; } else { current->next = help; current = help; } break; } counter++; // 读完3行(一个用户的全部信息)后重置计数器,准备读下一个用户 if (counter == 3) { counter = 0; } } fclose(file); }
关键改动说明
- 直接用
switch(counter)替换原有多分支if,每个case对应counter的0/1/2三种状态,逻辑和原if完全一致 - 修复原有代码读取完一个用户的3行信息后没有重置counter的问题,支持读取多个用户数据
- 增加文件打开、内存分配的异常判断,避免程序无响应崩溃
- 去掉原有风险写法
printf(strcpy(...)),strcpy返回值直接作为printf格式字符串会存在注入风险,如需调试可单独加printf("姓名:%s\n", help->name)这类语句 - 补充链表插入逻辑,读取完成的结构体可以正常存入传入的head头指针指向的链表中
内容的提问来源于stack exchange,提问作者user17277981
相关产品推荐
相关产品推荐

