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

C语言多行多输入场景下Scanf函数无法读取第二个输入问题

问题原因

你遇到的现象由两个独立的错误共同导致:

  1. 输入缓冲区残留换行符
    第一个scanf("%c", &open_type)执行时,只会读取你输入的单个字符(比如你输入w后敲回车,该语句仅读走w),输入时按下回车产生的\n会残留在输入缓冲区中。第二个scanf("%[^\n]s", text_buffer)的匹配规则是读取所有非换行符的内容,遇到换行就终止匹配,因此它一执行就碰到残留的\n,直接结束读取,不会接收你后续的输入。
    另外这个格式串写法有误,%[^\n]本身就是完整的格式匹配符,后面不需要多余的s。
  2. fopen参数非法
    fopen的第二个参数要求是以'\0'结尾的C风格字符串,你传入的是单个char变量的地址,该地址对应的内存后面没有结束符\0,属于越界访问,行为未定义,大概率会导致文件打开失败,后续的fprintf操作也会直接崩溃。

修复方案

  • 修正fopen传参:将读取到的open_type拼接为合法的字符串
  • 清空输入缓冲区残留的换行符
  • 修正第二个scanf的格式串写法
  • 可选增加文件打开失败的判断,避免崩溃

修正后完整代码

#include <stdio.h>

struct file_struct
{
    FILE *fp;
};

int main(int argc, char** argv)
{
    if(argc < 2) {
        printf("请传入文件名参数\n");
        return 1;
    }
    char open_type;
    printf("Open type [w/a]: ");
    scanf("%c", &open_type);
    // 吃掉缓冲区残留的换行
    getchar();

    struct file_struct new_file;
    // 构造合法的fopen模式字符串
    char mode[2] = {open_type, '\0'};
    new_file.fp = fopen(argv[1], mode);
    if(new_file.fp == NULL) {
        printf("文件打开失败\n");
        return 1;
    }

    char text_buffer[128];
    printf("Enter text to add to file:\n");
    // 去掉多余的s,格式串正确写法
    scanf("%[^\n]", text_buffer);

    fprintf(new_file.fp, "%s\n", text_buffer);
    fclose(new_file.fp);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:36:06