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

为何在C语言中读取其他字符数组后无法访问首个读取的字符数组?

问题分析与解决方案

核心问题:缓冲区溢出破坏了text变量

你的代码中,循环内定义的char alpha[3] = {0};长度不足。每个输入项(比如a,H)包含3个字符,而scanf("%s", alpha)会自动在字符串末尾添加终止符'\0',这需要4个字节的存储空间。但alpha仅分配了3字节,写入时会超出数组边界,触发栈缓冲区溢出,直接覆盖了栈上的text变量内容,导致最后打印时text已被破坏,无法输出预期内容。

修复方案

  1. 扩大alpha数组容量:将char alpha[3] = {0};改为char alpha[4] = {0};(或更大值,比如8,留足冗余空间),确保能容纳输入字符串和终止符。
  2. 限制text的读取长度:为避免第一行输入过长导致text溢出,把scanf("%[^\n]", text);改为scanf("%1000[^\n]", text);(1000是因为text数组长度为1001,需留1字节给终止符)。
  3. 可选:清理缓冲区换行符:第一个scanf执行后,输入缓冲区会残留换行符,虽然scanf("%s")会自动跳过空白字符,但如果后续有其他读取操作可能出问题,可在第一个scanf后添加getchar();清除换行符。

修复后的代码示例:

char text[1001];
// 限制读取长度,防止text溢出
scanf("%1000[^\n]", text);
// 清除缓冲区中残留的换行符
getchar();
for (int i = 1; i <= 62; i++) {
    // 扩大数组容量,容纳输入项和终止符
    char alpha[4] = {0}, lit_orig, lit_replace;
    scanf("%s", alpha);
    lit_orig = alpha[0];
    lit_replace = alpha[2];
}

printf("\n%s", text);

额外说明

缓冲区溢出是C语言中常见的危险问题,不仅会破坏数据,还可能导致程序崩溃或安全漏洞。使用scanf读取字符串时,务必确保数组长度足够,或通过长度限制符(如%1000s、%1000[^\n])避免溢出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:05:22