3

私はCを少し実験してきました。私は通常PHPとjavascriptを使用します。

「HelloWorld」を実行してから、これを入力しました。これは、どこかのWebサイトからコピーしたものです...

#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個の整数を要求されたときにfloat(21.45など)を入力すると、20個の配列値に奇妙な数値が入力されて、「検索する値を入力してください」と急いで進みます。

ある種のバッファオーバーフローを作成しましたか?入力をチェックする必要があることはわかっていますが、自分が何をしたのか知りたいです。プログラムを使用して任意のコードを実行できますか?(まあ、いや、私の知識ではありません...しかし誰かができますか?)

4

3 に答える 3

5

ただし、20個の整数を要求されたときにfloat(21.45など)を入力すると、20個の配列値に奇妙な数値が入力されて、「検索する値を入力してください」と急いで進みます。

21.45toの呼び出しなどの値を入力するscanf("%d")と、それはではないため失敗し、 in (は有効なものとして抽出されます)をint残して再度処理されます。これにより、ループはこの値を何度も再読み取りします(毎回失敗するため)。奇妙な数は、配列の要素が初期化されていないためです。.45stdin21int

行われた割り当ての数を返す戻り値を確認し、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

標準入力に正しい形式ではないもの(この場合はfloat)を入力すると、値の抽出は失敗します。ただし、壊れたデータは入力ストリームから抽出されません。これは、それ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 に答える