C语言多行多输入场景下Scanf函数无法读取第二个输入问题
问题原因
你遇到的现象由两个独立的错误共同导致:
- 输入缓冲区残留换行符
第一个scanf("%c", &open_type)执行时,只会读取你输入的单个字符(比如你输入w后敲回车,该语句仅读走w),输入时按下回车产生的\n会残留在输入缓冲区中。第二个scanf("%[^\n]s", text_buffer)的匹配规则是读取所有非换行符的内容,遇到换行就终止匹配,因此它一执行就碰到残留的\n,直接结束读取,不会接收你后续的输入。
另外这个格式串写法有误,%[^\n]本身就是完整的格式匹配符,后面不需要多余的s。 - 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
相关产品推荐
相关产品推荐

