无意终止程序

时间:2013-01-28 02:38:51

标签: c

我是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);
}

我想知道我做错了什么?

2 个答案:

答案 0 :(得分:2)

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

除非您指定myNumber类型,否则其类型将被假定为int。当您为int说明符传递指向scanf%lf的指针时,会得到未定义的行为。

您需要指定myNumber的类型为double

long double ObtainNumber (double myNumber)

请注意,这不允许您将myNumber的值传递回调用者:该值将在通过值传递的参数中设置;一旦函数退出,它就会被丢弃。

如果需要从函数返回值,则需要将指针传递给myNumber

long double ObtainNumber (double *myNumberPtr)

答案 1 :(得分:2)

您没有为函数声明myNumber参数的类型,因此它被假定为int。然后,您继续将其传递给scanf,期望它为double,并且最终会发生各种不良事件。

在这种情况下,不清楚为什么myNumber完全是一个参数 - 它肯定不会影响函数的作用。您可能只想将其声明为局部变量:

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

顺便说一下,long double不太可能是你真正想要的类型。它是一种时髦的扩展精度类型,它可以根据您正在使用的体系结构,编译器和系统而改变大小。 (ref)它很少使用,也没有必要。 double更容易打字,更有可能按照您的预期行事。