3

我一直在用 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);
    }
}

到目前为止,一切都很好。我试图了解所有星星都在做什么,但它正在落入适当的位置(哈哈 - 坠落的星星 :)

但是,如果我在它要求我输入 20 个整数时输入一个浮点数,例如 21.45,它会冲到“输入要搜索的 val”,用奇怪的数字填充 20 个数组值。

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

4

3 回答 3

5

但是,如果我在它要求我输入 20 个整数时输入一个浮点数,例如 21.45,它会冲到“输入要搜索的 val”,并用奇怪的数字填充了 20 个数组值

如果您输入一个值,例如21.45调用 toscanf("%d")将失败,因为它不是int,并且将留下.45in stdin21将被提取为有效的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');
    }
}
于 2012-10-02T10:47:52.663 回答
2

如果您使用不正确格式的内容(在本例中为浮点数)填充标准输入,则值的提取将失败。但是,损坏的数据不会从输入流中提取出来。这意味着scanf将反复失败。因此,arr[0...MAX-1]scanf 根本没有填写您的内容。

于 2012-10-02T10:48:21.013 回答
0

如果你想得到一个浮点数,那么在 scanf 你需要有:

scanf("%f", &arr[count]);

此外,您需要将数组声明为float arr[MAX]

于 2012-10-02T10:52:38.743 回答