Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中,从函数返回scanf值_C - Fatal编程技术网

在C中,从函数返回scanf值

在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 ) {

我试图在计算器程序中编写一个子函数来验证操作数。我希望该函数将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 ) 
        {
            // 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
,…)