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

使用fputs()写入文件遇输入异常,无法获取后续学生姓名求助

问题分析与解决方案

问题根源

你遇到的问题是输入缓冲区残留的换行符导致的:

  • 第一次输入完绩点后按下回车,scanf("%f", &cgpa)只会读取浮点数,回车产生的换行符会留在输入缓冲区中。
  • 第二次循环调用gets(name)时,gets会直接读取这个残留的换行符作为输入,所以看起来像是跳过了姓名输入,实际上已经读取了一个空字符串。

解决方法

方法1:清除scanf后的换行符

在每次scanf读取绩点后,调用getchar()吃掉缓冲区里的换行符,修改后的关键代码如下:

printf("Enter students cgpa: ");
scanf("%f", &cgpa);
getchar(); // 清除输入缓冲区中残留的换行符
fprintf(fp, "	%0.2f", cgpa);

方法2:替换不安全的gets函数(推荐)

gets函数已被C标准废弃,存在缓冲区溢出风险,建议用fgets替代,同时处理换行符问题,完整代码如下:

#include <stdio.h>
#include <string.h> // 需要strchr函数

int main(){

    FILE *fp;
    char name[25];
    int i;
    float cgpa;

    fp = fopen("FileExercise.txt", "w");

    if(fp==NULL) printf("File doesn't exist.\n");
    else{
        printf("File has opened.\n");
        for(i=0; i<5; i++){
            printf("Enter roll-%d student name: ", i+1);
            // 用fgets读取姓名,支持带空格的输入
            fgets(name, sizeof(name), stdin);
            // 去除fgets读取到的末尾换行符
            char *newline_pos = strchr(name, '\n');
            if(newline_pos != NULL){
                *newline_pos = '\0';
            }
            
            fputs(name, fp);
            fprintf(fp, "	%d", i+1);

            printf("Enter students cgpa: ");
            scanf("%f", &cgpa);
            getchar(); // 清除换行符,避免影响下一次fgets
            
            fprintf(fp, "	%0.2f", cgpa);
            fprintf(fp, "\n");
        }
        printf("File has written successfully.\n");
    }

    return 0;
}

方法3:用scanf直接读取姓名(不支持带空格)

如果不需要支持带空格的姓名,可以用scanf("%24s", name)替代gets,同时在scanf前加空格跳过空白字符:

printf("Enter roll-%d student name: ", i+1);
scanf(" %24s", name); // 前面的空格跳过缓冲区里的换行符

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:50:27