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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:20:29