下述C语言代码中for循环出现无限运行是什么原因?
代码问题分析
循环无限运行的根因
scanf格式符使用严重错误:%s是字符串读取格式符,无论用户输入几个可见字符,都会自动在末尾追加\0作为字符串结束标记。你传入的是单字符地址&k[i],哪怕每次仅输入1个可见字符,也会写入2字节数据(可见字符+\0),直接触发数组越界。- 栈溢出覆盖循环变量:C语言栈上的局部变量为连续排布,绝大多数编译环境下循环变量
i存储在数组k的高地址方向,数组越界写入的数据会覆盖i的内存空间,导致i的值被改写为非预期数值,永远无法满足i<5的退出条件,最终出现无限循环。 - 额外隐患:如果用户单次输入超过1个字符,越界写入的程度会进一步加剧,除了无限循环外还可能直接触发程序崩溃。另外代码中的
void main()不符合C语言标准,标准写法为int main(void),需要补充返回值。
修正方案
如果需求是逐个读取5个单字符存储到数组中,正确代码如下:
#include <stdio.h> int main(void) { char k[5]; for(int i=0;i<5;i++){ printf("enter char: "); // 格式符前加空格,跳过之前残留的换行、空格等空白字符 scanf(" %c", &k[i]); } // 测试输出 for(int i=0;i<5;i++){ printf("%c ", k[i]); } return 0; }
如果需求是读取1个长度不超过4的字符串,不需要循环,直接一次性读取即可:
#include <stdio.h> int main(void) { char k[5]; printf("enter string: "); // 限制最多读取4个字符,预留结束符位置避免溢出 scanf("%4s", k); printf("%s", k); return 0; }
内容的提问来源于stack exchange,提问作者Indratej Reddy
相关产品推荐
相关产品推荐

