0

私はCを初めて使用し、scanf関数を使用しています。ユーザーに入力を求めている数値は、myNumberという名前の長整数です。しかし、値を入力すると、プログラムは「セグメンテーション違反:11」を返します。

long double ObtainNumber (myNumber)
{

    scanf("%lf", &myNumber);
    while (myNumber > 999999999)
        {
            printf("Error. Please enter a number with no greater than 9 digits\n");
            scanf("%lf", &myNumber);
        }

    return (myNumber);
}

私は何が間違っているのだろうと思っていましたか?

4

2 に答える 2

2
long double ObtainNumber (/* you have no type name here */myNumber)

のタイプを指定しない限りmyNumber、そのタイプは。と見なされますintint指定子のへscanfのポインタを渡すと、%lf未定義の動作が発生します。

のタイプを指定する必要がありmyNumberますdouble

long double ObtainNumber (double myNumber)

myNumberこれでは、の値を呼び出し元に戻すことはできないことに注意してください。値は、値によって渡されるパラメーターに設定されます。関数が終了するとすぐに破棄されます。

関数から値を返す必要がある場合は、myNumber:へのポインターを渡す必要があります。

long double ObtainNumber (double *myNumberPtr)
于 2013-01-28T02:44:26.540 に答える
2

myNumber関数の引数の型を宣言しないため、 int. scanf次に、それがであることを期待するに渡すとdouble、あらゆる種類の悪いことが起こります。

この場合、myNumberが引数である理由がまったく明確ではありません。関数の動作にはまったく影響しません。おそらく、それをローカル変数として宣言することを意味します。

long double ObtainNumber(void)
{
    long double myNumber;
    scanf("%lf", &myNumber);
    ...

ところで、long double実際に必要なタイプである可能性は低いです。これは、使用しているアーキテクチャ、コンパイラ、およびシステムに基づいてサイズが異なる可能性がある一種のファンキーな拡張精度型です。(参照)めったに使用されず、必要もありません。double入力しやすく、期待どおりに動作する可能性が高くなります。

于 2013-01-28T02:47:26.283 に答える