0

私のコード

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

void getData(short int *number, char *string)
{
    printf("\nPlease enter a number greater than zero: ");
    scanf("%hd", number);

    printf("Please enter a character string: ");
    scanf("%s", string);
}

void echoPair(short int *number, char *string)
{
    printf("Number: %hd Character(s): %s\n", *number, string); 
}

int main()
{
    short int *number = 0;
    char string[32] = {0};

    printf("This program will ask you to enter a number greater than zero and \na character string with less than 32 characters \ninput.");

    getData(&number, &string);
    echoPair(&number, &string);
    return(0);
}

コードは正常に動作しますが、これらのコンパイラ警告が表示されます

warning: passing argument 1 of ‘getData’ from incompatible pointer type
warning: passing argument 2 of ‘getData’ from incompatible pointer type
warning: passing argument 1 of ‘echoPair’ from incompatible pointer type
warning: passing argument 2 of ‘echoPair’ from incompatible pointer type

こうすれば

    getData(number, string);
    echoPair(number, string);

警告は消えますが、getData 関数に最初の数値を入力すると、プログラムは「Segmentation fault: 11」を受け取ります。

警告を削除してプログラムを動作させ続ける方法を知っている人はいますか?

ありがとう

4

2 に答える 2

5

ここには多くの問題があります。


まず、次の行:

short int *number = 0;

次のようにする必要があります。

short int number = 0;

前者を使用したため、 への null ポインターが返されましたshort。その獣の最初の逆参照はおそらくあなたのコードをクラッシュさせるでしょう (あるいは、さらに悪いことに、あなたのコードをクラッシュさせに奇妙な動作を引き起こすでしょう)。


次に、文字列のアドレスを渡す必要はありません。文字列は自動的にアドレスに減衰するため、次のように変更します。

getData (&number, &string);
echoPair (&number, &string);

に:

getData (&number, string);
echoPair (&number, string); // but see last point below.

最後に、印刷するためだけにアドレスを渡す必要はありません。値を渡すだけでよいため、次のようになります。

echoPair (&number, &string);

になります:

echoPair (number, string);

全体として、私はあなたが望むものは次のとおりだと思います:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

void getData(short int *number, char *string) {
    printf("\nPlease enter a number greater than zero: ");
    scanf("%hd", number);

    printf("Please enter a character string: ");
    scanf("%s", string);
}

void echoPair(short int number, char *string) {
    printf("Number: %hd Character(s): %s\n", number, string);
}

int main (void) {
    short int number = 0;
    char string[32] = {0};

    printf("Blah blah ...");

    getData(&number, string);
    echoPair(number, string);
    return(0);
}

余談ですが、次のような無制限の文字列スキャンは見たくありません。

scanf ("%s", string);

本番対応のコードで。ユーザーが何を入力するかを制御できないため、バッファ オーバーフローの脆弱性が発生するのを待っています。特定のケースでは、ユーザーが (約) 30 文字を超える文字を入力すると、あらゆる種類の奇妙な動作が発生する可能性があります。

このscanf関数はフォーマットされたテキストをスキャンするためのものであり、ユーザー入力ほどフォーマットされていないものはあまりありません:-)

堅牢なユーザー入力機能が必要な場合は、こちらを参照してください。

于 2011-08-30T03:10:48.107 に答える
1

numberローカル変数を short int へのポインターとして宣言します。次に、それへのポインタをgetDataandに渡しますechoPair。したがって、ポインターをポインターに渡していますが、これは間違った型です。おそらく、number をポインターではなく、短い int として宣言する必要があります。

于 2011-08-30T03:10:44.907 に答える