为什么这个C程序是梨形的?我打破了我的缓冲区吗?

Pet*_*ete 3 c buffer-overflow

我一直在尝试使用C语言.我通常使用PHP和JavaScript.

我做了"Hello World",然后输入了这个,我从某个网站复制了...

#include <stdio.h>
#include <stdlib.h>
#define MAX 20
int intcmp(const void*v1, const void *v2){
    return (*(int *)v1 - *(int *)v2);
}
main(){
    int arr[MAX], count, key , *ptr;
    printf("Enter %d integer values; press enter after each\n", MAX);
    for (count = 0; count < MAX; count++)
        scanf("%d", &arr[count]);
    puts("Press a key to sort the values");
    getc(stdin);

    qsort(arr, MAX, sizeof(arr[0]), intcmp);

    for(count=0; count < MAX; count++)
        printf("\narr[%d] = %d.", count, arr[count]);

    puts("\nPress a key to continue");
    getc(stdin);

    printf("Enter a val to search for");
    scanf("%d", &key);

    ptr = (int * )bsearch(&key, arr, MAX, sizeof(arr[0]), intcmp);

    if(ptr != NULL){
        int fred =  (ptr - arr);
        printf("%d found at arr[%d]", key ,fred);
    }else{
        printf("%d not found", key);
    }
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.我试图了解所有明星的所作所为,但它已经落到了位置(哈哈 - 流星......)

但是,如果我输入一个浮点数,例如21.45,当它要求我输入20个整数时,它会突然转到"输入一个val来搜索",并用奇怪的数字填充了20个数组值.

我创建了某种缓冲区溢出吗?我意识到应该检查输入 - 但我很想知道我做了什么.我可以使用我的程序运行任意代码吗?(嗯,不,不是我的知识......但有人可以吗?)

hmj*_*mjd 5

但是,如果我输入一个浮点数,例如21.45,当它要求我输入20个整数时,它会通过"输入一个val来搜索",并用奇怪的数字填充了20个数组值

如果输入一个值,如21.45调用scanf("%d")会失败,因为它不是一个int,并且将离开.45stdin(在21将被提取为有效int)被再次处理.这会导致循环一次又一次地重新读取该值(因为它每次都失败).奇怪的数字是由于数组的元素未初始化.

检查返回值scanf()返回的分配数量,如果失败,则跳过以下内容stdin:

int count = 0;
while (count < MAX)
{
    if (1 == scanf("%d", &arr[count]))
    {
        count++; /* OK, so get next. */
    }
    else
    {
        /* !OK, skip invalid input. */
        int c;
        while ((c = fgetc(stdin)) != EOF && c != '\n');
    }
}
Run Code Online (Sandbox Code Playgroud)