我怎么会不小心过滤了我的输入?[closed]

e1xvtsh3  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(188)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
10天前关闭。
Improve this question

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

这段代码应该在数组“vstup[2000]“中输入不超过2000个int值,但是我没有检查输入是否为int,如果不是,它就在“if(velikostVstupu>2000)“之后(我在这里检查是否超过2000)。
为什么?这背后的数学原理是什么?

cwtwac6a

cwtwac6a1#

scanf()可能无法读取数字并返回0。除非输入缓冲区发生变化,否则它将永远这样做,直到达到计数限制。在该点之后,每个数组都将是未定义的。您还没有告诉我们该输入如何处理“跳过非数字”。
当你读取vstup == 2000条目时,你会溢出数组,因为测试是在你已经读取了值之后(未定义的行为)。

#include <stdio.h>
#define MAX_VSTUP 2000

int main(void) {
    int vstup[MAX_VSTUP];
    size_t velikostVstupu=0;
    for(; velikostVstupu < sizeof vstup / sizeof *vstup; velikostVstupu++) {
        if(scanf("%d", vstup+velikostVstupu) != 1)
            break;
    }
    printf("Nespravny vstup %zu.\n", velikostVstupu);
}

下面是一些运行示例:

$ seq 1 | ./a.out
Nespravny vstup 1.
$ seq 2000 | ./a.out
Nespravny vstup 2000.
$ seq 2001 | ./a.out
Nespravny vstup 2000.
dsekswqp

dsekswqp2#

感谢@JonathanLeffler,我想我知道当输入非数字时会发生什么。它只读取非数字,直到非数字将其余部分留在缓冲区中。当下一个请求时,它忽略白色,他立即找到一个非数字,不取任何内容,并将缓冲区保留不变,但增加velikostVstupu。这种情况一直持续到velikostVstupu〉2000。

相关问题