C语言控制台粘贴多行文本闪退问题求助
问题原因与解决方案
这个问题我太熟了,核心原因就是你用的gets()函数本身存在严重的安全缺陷,加上输入长度超出了缓冲区的容量,触发了缓冲区溢出,直接导致程序崩溃(控制台闪退)。
具体原因拆解:
gets()的致命缺陷:这个函数完全不检查输入的长度,不管你定义的数组text[1000]能装多少字符,它都会把所有输入一股脑往里塞。当你粘贴的长文本(包括空格、换行符等所有字符)总长度超过1000时,多余的字符会覆盖数组后面的内存区域,破坏程序的栈结构,触发未定义行为——也就是你看到的控制台闪退。- 单行短文本正常的原因:短文本的总字符数在
text[1000]的容量范围内,没有发生缓冲区溢出,所以程序能正常执行。
修复方案:替换为安全的fgets()函数
gets()早在C11标准里就被移除了,现在推荐使用fgets(),它可以指定最大读取字符数,从根源上避免缓冲区溢出。
基础版代码:
#include <stdio.h> int main() { char text[1000]; // 第二个参数是缓冲区大小,第三个参数指定从标准输入读取 fgets(text, sizeof(text), stdin); printf("%s", text); return 0; }
优化版(去掉换行符):
fgets()会把输入末尾的换行符\n也读进数组里,如果不需要这个换行符,可以手动移除:
#include <stdio.h> #include <string.h> int main() { char text[1000]; fgets(text, sizeof(text), stdin); // 用strcspn找到换行符的位置,替换为字符串结束符 text[strcspn(text, "\n")] = '\0'; printf("%s", text); return 0; }
内容的提问来源于stack exchange,提问作者SixSickSheep
相关产品推荐
相关产品推荐

