为何在C语言中读取其他字符数组后无法访问首个读取的字符数组?
问题分析与解决方案
核心问题:缓冲区溢出破坏了text变量
你的代码中,循环内定义的char alpha[3] = {0};长度不足。每个输入项(比如a,H)包含3个字符,而scanf("%s", alpha)会自动在字符串末尾添加终止符'\0',这需要4个字节的存储空间。但alpha仅分配了3字节,写入时会超出数组边界,触发栈缓冲区溢出,直接覆盖了栈上的text变量内容,导致最后打印时text已被破坏,无法输出预期内容。
修复方案
- 扩大
alpha数组容量:将char alpha[3] = {0};改为char alpha[4] = {0};(或更大值,比如8,留足冗余空间),确保能容纳输入字符串和终止符。 - 限制
text的读取长度:为避免第一行输入过长导致text溢出,把scanf("%[^\n]", text);改为scanf("%1000[^\n]", text);(1000是因为text数组长度为1001,需留1字节给终止符)。 - 可选:清理缓冲区换行符:第一个
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
相关产品推荐
相关产品推荐

