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

C语言使用scanf()时for循环i=1后运行异常问题咨询

问题根因

代码存在两个核心bug,共同导致运行异常:

  • scanf格式字符串写法错误:格式串中%d后额外添加的换行符\n是程序卡住的直接诱因。scanf对格式串中空白字符(换行、空格、制表符)的处理逻辑是连续匹配输入流中任意数量的空白字符,直到遇到第一个非空白字符才停止匹配。输入数字按下回车后,输入流里的换行符会被格式串里的\n持续匹配,scanf会一直阻塞等待空白输入结束,直到用户输入非空白的字母时才会终止本次匹配,进入下一轮循环,表现为程序停止响应、必须输字母才能继续。
  • 内存越界访问(致命问题):main函数中定义的int arr[] = {};是零长度数组,属于编译器扩展语法,本身没有分配任何可存储int类型元素的合法内存空间。同时代码中使用arr[i+1]作为写入地址,就算提前给数组分配了4个元素的空间,最后一轮循环i=3时会访问arr[4],依然超出数组边界。这类越界写入属于C语言标准定义的未定义行为,直接导致输入值无法正确存储、程序运行逻辑混乱,严重时会直接触发段错误崩溃。
修复方案

针对问题点逐一修正即可:

  • 删除scanf格式串中%d后多余的\n,仅保留"%d"作为格式匹配串。
  • 为数组分配足够的合法内存:如果需要固定存储4个int值,定义数组时显式指定长度为4;如果要适配可变长度的输入需求,也可以根据传入的参数n通过malloc动态申请堆内存。
  • 修正数组访问下标,从下标0开始依次写入输入值,避免越界和空间浪费。

修复后的可运行代码如下:

#include <stdio.h>
#include <stdlib.h>

void add(int *arr, int n);

int main() {
  // 显式定义长度为4的数组,分配足够的合法存储内存
  int arr[4];
  add(arr, 4);

  // 验证输入结果
  for (int i = 0; i < 4; i++) {
    printf("arr[%d] = %d\n", i, arr[i]);
  }
  return 0;
}

void add(int *arr, int n) {
  for (int i = 0; i < n; i++) {
    printf("%d index is : ", i);
    // 移除格式串多余换行,使用下标i从0开始写入
    scanf("%d", &arr[i]);
  }
}

内容的提问来源于stack exchange,提问作者Aditya Paluskar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:57:15