在C中,从函数返回scanf值
我试图在计算器程序中编写一个子函数来验证操作数。我希望该函数将scanf输入返回到main()函数。下面是我用于子函数的代码:在C中,从函数返回scanf值,c,C,我试图在计算器程序中编写一个子函数来验证操作数。我希望该函数将scanf输入返回到main()函数。下面是我用于子函数的代码: void checkOperand(float f1, float f2) { printf("Please enter two numbers to add, separated by a space: \n\n"); while( (scanf("%f %f",&f1,&f2)) !=2 ) {
void checkOperand(float f1, float f2)
{
printf("Please enter two numbers to add, separated by a space: \n\n");
while( (scanf("%f %f",&f1,&f2)) !=2 )
{
// you will enter this loop when there is wrong input from the user and there may be garbage characters inputted.
// eat up each character until buffer is clear indicated by new line
while(getchar() != '\n')
{
continue;
}
printf("\nError reading your input. Please try again: \n\n");
}
}
然后,在main()函数中,我尝试调用它:
int main(int argc, const char * argv[])
{
int nChoice = 6; // initialize with an invalid choice
float fNums1;
float fNums2;
float result;
printf("Welcome to My Handy Calculator:\n\n\t1. Addition\n\t2. Subtraction\n\t3. Division\n\t4. Multiplication\n\t5. Exit\n\n");
//scanf returns number of successful translations. If user inputs characters instead of numbers, it will not return 1 as you are
//scanning one value. This is the way to trap the wrong user input.
nChoice = checkMenuOption(nChoice);
switch ((nChoice))
{
case 1:
checkOperand(fNums1,fNums2);
result = fNums1 + fNums2;
printf("\n\nResult of adding %5.2f and %5.2f is %5.2f \n\n",fNums1,fNums2,result);
break;
}
}
但是scanf函数的值(f1和f2)不会返回到主函数,并且在执行计算时,它会显示:
"Result of adding 0 and 0 is 0."
您的参数是按值传递的。将参数更改为按指针传递:
void checkOperand(float *f1, float *f2)
及
在您的呼叫代码中
checkOperand(&fNums1,&fNums2);
您的参数是按值传递的。将参数更改为按指针传递:
void checkOperand(float *f1, float *f2)
及
在您的呼叫代码中
checkOperand(&fNums1,&fNums2);
如果将浮点值传递给checkOperand,则必须传递浮点值和赋值。如果将浮点值传递给checkOperand,则必须传递浮点值和赋值。正向声明定义如下:void checkOperand(float,float);我也需要改变吗?因为我尝试了您的建议,得到了一条错误消息:Midterm1v002.c:在函数“main”中:Midterm1v002.c:27:4:错误:“checkOperand”checkOperand(&fNums1,&fNums2)的参数1的类型不兼容;^中期1V002.c:6:6:注意:应为“float”,但参数类型为“float*”void checkOperand(float,float);没有关系。我把它改为:void checkOperand(float*,float*),它成功了。谢谢你的帮助!正向声明定义如下:void checkOperand(float,float);我也需要改变吗?因为我尝试了您的建议,得到了一条错误消息:Midterm1v002.c:在函数“main”中:Midterm1v002.c:27:4:错误:“checkOperand”checkOperand(&fNums1,&fNums2)的参数1的类型不兼容;^中期1V002.c:6:6:注意:应为“float”,但参数类型为“float*”void checkOperand(float,float);没有关系。我把它改为:void checkOperand(float*,float*),它成功了。谢谢你的帮助!使用所有警告和调试信息(
gcc-Wall-Wextra-g
)编译,然后使用调试器(gdb
)。您绝对应该学习如何使用调试工具(gdb
,…)编译所有警告和调试信息(gcc-Wall-Wextra-g
),然后使用调试器(gdb
)。您绝对应该学习如何使用调试工具(gdb
,…)