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

为何非int输入会触发数组容量超限判断?scanf输入逻辑疑问

问题分析:scanf输入非int值触发数组容量超限的原因

以下代码意图将不超过2000个int值读入数组vstup[2000]:

int velikostVstupu=0;
while(scanf("%d", vstup+velikostVstupu)!=EOF){
        velikostVstupu++;
        if(velikostVstupu>2000){
                printf( "Nespravny vstup.\n");
                return 0;
        }
}

代码未检查输入是否为int类型,但当输入非int值时,却触发了if(velikostVstupu>2000)的容量超限判断,请问这是为什么?背后的原理是什么?


核心原因:scanf的返回值规则与输入流阻塞导致死循环

  • scanf的返回值逻辑:
    使用%d格式符时,scanf的返回值分三种情况:成功读取int类型值时返回1;遇到非int格式的输入(如字母、特殊符号)读取失败时返回0;输入流到达末尾(如手动终止输入)时返回EOF。
  • 死循环的触发过程:
    当输入非int值时,scanf返回0,而循环条件仅判断scanf(...) != EOF,0不等于EOF,循环会持续执行。同时,无效的输入字符会留在输入流中不被消耗,下一次循环时scanf依然会读取这个无效字符并返回0,循环永远无法终止。随着循环不断执行,velikostVstupu持续自增,直到超过2000,触发容量超限判断。
  • 代码逻辑漏洞:
    原代码只处理了输入流结束的情况,没有处理输入格式错误导致的返回值为0的情况,这是引发问题的核心原因。正确的逻辑应该判断scanf的返回值是否为1(即成功读取一个int),否则就终止循环并处理输入错误。

内容的提问来源于stack exchange,提问作者Dominik Sládek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:20:32