为何非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
相关产品推荐
相关产品推荐

