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

文件写入与循环if语句应用问题:基础信息录入系统开发故障

修复你的简易信息录入系统问题

嘿,我看你这个信息录入系统卡在了文件写入和循环控制上,结合你描述的问题和代码片段,我整理了一套修复方案,咱们一步步来:

先梳理核心问题的常见诱因

从你说的症状来看,大概率是这几个点出了问题:

  • 文件操作时没检查打开状态,或者写入方式不对
  • 输入edit时的循环跳转逻辑没处理好,比如没重置录入流程的状态,或者残留了缓冲区的换行符干扰判断
  • 重复询问的循环条件写反了,或者字符串比较时没处理fgets读入的换行符

修正后的完整代码

#include <stdio.h>
#include <string.h>

// 封装输入函数,自动去除换行符
int get_line(const char *prompt, char *dest, size_t size) {
    printf("%s", prompt);
    // 读取输入,失败直接返回错误
    if (fgets(dest, size, stdin) == NULL) {
        return -1;
    }
    // 去掉fgets读入的换行符
    dest[strcspn(dest, "\n")] = '\0';
    return 0;
}

int main() {
    char name[50], id[20], confirm[10];
    int should_restart;

    do {
        should_restart = 0;
        // 录入基础信息
        printf("=== 开始录入信息 ===\n");
        get_line("请输入姓名:", name, sizeof(name));
        get_line("请输入ID:", id, sizeof(id));

        // 展示信息
        printf("\n=== 你录入的信息如下 ===\n");
        printf("姓名:%s\n", name);
        printf("ID:%s\n", id);

        // 确认流程
        while (1) {
            get_line("确认信息是否正确?(输入y确认写入,输入edit重新录入,其他内容重复询问):", confirm, sizeof(confirm));
            
            // 处理edit回到录入起点
            if (strcmp(confirm, "edit") == 0) {
                should_restart = 1;
                break;
            }
            // 确认写入文件
            else if (strcmp(confirm, "y") == 0) {
                // 打开文件,用追加模式(如果要覆盖就用"w")
                FILE *fp = fopen("user_info.txt", "a");
                if (fp == NULL) {
                    printf("错误:无法打开文件!\n");
                    break;
                }
                // 写入信息
                fprintf(fp, "姓名:%s,ID:%s\n", name, id);
                fclose(fp);
                printf("信息已成功写入文件!\n");
                should_restart = 0;
                break;
            }
            // 其他输入重复询问
            else {
                printf("输入无效,请重新输入!\n");
            }
        }
    } while (should_restart); // 当需要重启时回到录入起点

    printf("程序结束!\n");
    return 0;
}

关键改动说明

  • 输入函数优化:在get_line里用strcspn去掉了fgets读入的换行符,避免后续字符串比较时因为隐藏的换行符导致判断失败(比如用户输入edit后,原代码可能读成edit\n,和"edit"比较就不相等)
  • 文件写入修复:
    • 打开文件时增加了空指针检查,避免文件打不开时直接写入导致崩溃
    • 使用"a"追加模式(如果需要每次覆盖文件就换成"w"),确保信息能正确写入
    • 写完后及时关闭文件,避免资源泄漏
  • 循环控制逻辑:
    • 用should_restart变量控制外层循环,输入edit时把它设为1,直接跳出内层确认循环,回到录入起点
    • 内层确认循环用while(1)做无限循环,只有触发edit、y或者文件错误时才跳出,确保其他输入会重复询问
  • 用户体验优化:增加了清晰的分隔线和提示文本,让流程更直观

你可以把这段代码替换你的原有代码试试,应该能解决文件写入和循环控制的问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:04:23