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

scanf读取行数后fgets需额外按回车的问题解决咨询

scanf读取整数后fgets需额外回车的问题解决

现象是否正常?

这是正常现象。原因是scanf("%d", &line_count)仅读取输入中的数字部分,你输入数字后按下的回车(即换行符\n)会残留在标准输入缓冲区中。后续调用fgets时,它会优先读取缓冲区里的这个换行符,相当于第一次fgets直接读取了一个空行,因此你需要额外按一次回车才能输入真正的内容。

解决方法

方案一:手动清除缓冲区残留的换行符

在scanf读取整数后,添加代码清空缓冲区中剩余的字符(直到换行符):

// 清除scanf留下的换行符
while ((getchar()) != '\n');

修改后的完整代码:

int main() {

    FILE *myfile;
    myfile = fopen("test.txt", "w");

    int line_count;

    printf("Enter number of line:");
    scanf("%d", &line_count);
    // 清除缓冲区中残留的换行符
    while ((getchar()) != '\n');

    if (myfile == NULL) {
        printf("Can't create!");
        return 1;
    }

    char line[100];

    for (int i = 0; i < line_count; i++) {
        fgets(line, sizeof(line), stdin);
        fprintf(myfile, "Line %d: %s", i+1, line); // 补充写入用户输入的内容,原代码未包含
    }

    fclose(myfile);
    return 0;
}

方案二:用fgets读取整行后转成整数

完全避免使用scanf读取数字,先用fgets读取包含数字的整行输入,再通过sscanf将字符串转换为整数,从根源上避免缓冲区残留问题:

int main() {

    FILE *myfile;
    myfile = fopen("test.txt", "w");

    int line_count;
    char input[100];

    printf("Enter number of line:");
    fgets(input, sizeof(input), stdin);
    sscanf(input, "%d", &line_count);

    if (myfile == NULL) {
        printf("Can't create!");
        return 1;
    }

    char line[100];

    for (int i = 0; i < line_count; i++) {
        fgets(line, sizeof(line), stdin);
        fprintf(myfile, "Line %d: %s", i+1, line);
    }

    fclose(myfile);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 12:13:09