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

下述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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:18:02