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

C语言中fgets()无法接收用户键盘输入问题求助

解决C语言代码中fgets无法接收输入的问题

核心问题原因

  • scanf残留换行符:使用scanf("%d", &c)读取选择项时,输入数字后按下的回车(\n)会留在标准输入缓冲区。后续调用fgets时,它会直接读取这个换行符,误以为已经完成输入,导致看起来无法接收用户输入。

其他代码问题

  • switch语句缺少break:case 1执行完写入操作后,会自动执行case 2的读取操作,不符合按需读写的逻辑。
  • 结构体值传递:write函数接收的是结构体副本,若后续需要修改结构体其他字段,副本的修改不会同步到主函数的变量。
  • 文件操作错误:write函数提前关闭文件指针,导致后续read操作使用悬空指针,属于未定义行为;且写入后文件指针停在末尾,直接读取会无法获取内容。
  • read函数循环逻辑:do-while会先执行一次读取,若文件为空会输出EOF对应的乱码字符。

修复方案

  1. 清空输入缓冲区:在scanf后加入循环,清空缓冲区所有残留字符直到换行符:
    while ((getchar()) != '\n');
    
  2. 给switch的case添加break:确保每个case执行后跳出switch。
  3. 结构体改为指针传递:让write函数直接修改主函数的结构体变量。
  4. 统一管理文件关闭:主函数中统一关闭文件,避免重复关闭或悬空指针操作。
  5. 调整文件指针位置:写入后用fseek(fp, 0, SEEK_SET)将指针移到文件开头,方便读取。
  6. 修正read函数循环:改用while循环先判断再读取,避免输出乱码。

修复后的完整代码

#include <stdio.h>
#include <stdlib.h>

typedef struct Details{
    int num;
    char message[100];
}Notes;

void write(FILE*, Notes*);
void read(FILE*);

int main()
{
    int c;
    FILE *fp = fopen("Notes.txt", "w+");
    Notes txt;
    if(fp == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    printf("选择操作\n1.写入\n2.读取\n");
    scanf("%d", &c);
    // 清空输入缓冲区残留字符
    while ((getchar()) != '\n');

    switch(c){
        case 1:
            write(fp, &txt);
            break;
        case 2:
            read(fp);
            break;
        default:
            printf("无效选项\n");
    }
    fclose(fp);
    return 0;
}

void write(FILE* fp, Notes *msg)
{
    puts("请输入文本:");
    fgets(msg->message, sizeof(msg->message), stdin);
    fputs(msg->message, fp);
    // 将文件指针移到开头,方便后续读取
    fseek(fp, 0, SEEK_SET);
}

void read(FILE* fp)
{
    char ch;
    while((ch = fgetc(fp)) != EOF){
        printf("%c", ch);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:32:31