C语言程序无法接收字符串输入直接执行完成的问题求助
问题分析与修复方案
核心问题原因
- 输入缓冲区残留换行符:
scanf("%s", &name)读取文件名时,只会读取到第一个空白字符(比如输入文件名后按下的回车),这个回车符会留在标准输入缓冲区中。后续调用gets()时,它会直接读取这个残留的换行符,误以为用户已经完成输入,因此跳过了实际的字符串输入步骤。 scanf参数错误:name是字符数组名,本身就代表数组首元素的地址,不需要加&,加&会导致类型不匹配(char (*)[100]和char*)。gets()函数不安全:该函数已被C标准废弃,它不检查输入长度,一旦用户输入的字符串超过str的容量,会直接导致缓冲区溢出,引发程序崩溃或安全风险。
修复步骤
- 清理输入缓冲区的残留换行符,确保后续输入函数能正常读取用户输入。
- 替换
gets()为安全的fgets(),避免缓冲区溢出。 - 修正
scanf的参数,移除多余的&。 - 增加文件打开失败的错误判断,避免程序在异常情况下崩溃。
- 操作完成后关闭文件,确保写入的内容及时同步到磁盘。
修正后的代码
#include <stdio.h> #include <string.h> int main() { FILE *filepointer; printf("Enter file name with extension:\n"); char name[100]; // 修正scanf参数,读取文件名 scanf("%s", name); // 清理输入缓冲区中残留的换行符 getchar(); // 检查文件是否成功打开 filepointer = fopen(name, "w"); if (filepointer == NULL) { printf("Failed to open file!\n"); return 1; } char str[1024]; printf("Enter what you want to write\n"); // 用fgets替代gets,指定最大读取长度,避免缓冲区溢出 fgets(str, sizeof(str), stdin); // 移除fgets读取到的换行符(如果存在) str[strcspn(str, "\n")] = '\0'; fprintf(filepointer, "%s", str); // 关闭文件,确保内容写入磁盘 fclose(filepointer); return 0; }
关键修改说明
getchar():读取scanf遗留的换行符,让后续的fgets()能正确获取用户输入的字符串。fgets(str, sizeof(str), stdin):从标准输入读取最多sizeof(str)-1个字符,自动在末尾添加字符串终止符'\0',彻底避免缓冲区溢出问题。str[strcspn(str, "\n")] = '\0':利用strcspn找到输入字符串中第一个换行符的位置,将其替换为终止符,避免写入文件时多出不必要的空行。fclose(filepointer):文件使用完毕后必须关闭,否则可能导致写入的内容无法及时保存到磁盘,还会造成系统资源泄漏。- 文件打开失败判断:当文件无法打开(比如权限不足、路径无效)时,程序会直接提示错误并退出,避免后续的非法内存操作。
内容的提问来源于stack exchange,提问作者Aswin Pratapsingh
相关产品推荐
相关产品推荐

