我是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);
}
我想知道我做错了什么?
答案 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
更容易打字,更有可能按照您的预期行事。