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假定其类型为int。当您将指针传递intscanf说明%lf符时,您会得到未定义的行为。

您需要指定myNumber要成为的类型double

long double ObtainNumber (double myNumber)

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

如果你需要从函数返回值,你需要传递一个指针myNumber

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

您没有向myNumber函数声明参数的类型,因此假定它是int. 然后你继续将它传递给 a scanf,它期望它是 a double,各种坏事最终都会发生。

在这种情况下,根本不清楚为什么myNumber是参数——它当然根本不会影响函数的作用。您可能只想将其声明为局部变量:

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

顺便说一句,long double不太可能是您真正想要的类型。它是一种时髦的扩展精度类型,其大小会根据您使用的架构、编译器和系统而有所不同。( ref ) 它很少使用,也没有必要。double更容易键入,并且更有可能按照您期望的方式行事。

于 2013-01-28T02:47:26.283 回答