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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:45:03