C计算器中有很多函数在函数中函数在函数中

C计算器中有很多函数在函数中函数在函数中,c,function,pointers,function-pointers,calculator,C,Function,Pointers,Function Pointers,Calculator,我先编了一个简单的计算器。现在我想把各个程序组件的功能外包出去。问题是开关部分。程序总是给我默认消息:坏操作员。请看一下,给我一些提示。指针和双指针有什么问题吗 这是我的密码: #include "stdafx.h" #include <stdio.h> #include <stdlib.h> void newcalc(char*,double*,char*,double*); double switchfunk(double**, char**, double**);

我先编了一个简单的计算器。现在我想把各个程序组件的功能外包出去。问题是开关部分。程序总是给我默认消息:坏操作员。请看一下,给我一些提示。指针和双指针有什么问题吗

这是我的密码:

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>

void newcalc(char*,double*,char*,double*);
double switchfunk(double**, char**, double**);
double readcalc(double**,char**,double**);
double addition(double,double);
double subtraction(double,double);
double multiplication(double,double);
double division(double,double);

int main()
{
    double a=0, b=0;
    char op='R', restart = 'Y';
    newcalc(&restart,&a,&op,&b);
    fflush(stdin);
    getchar();
    return 0;
}

double switchfunk(double** x, char** opp, double** y)
{
    printf("\n ---CALCULATOR--- \n\n\n");
    switch (**opp)
    {
        case '+':printf("%lf + %lf = %lf\n", **x, **y, addition(**x, **y)); break;
        case '-':printf("%lf - %lf = %lf\n", **x, **y, subtraction(**x, **y)); break;
        case '*':printf("%lf * %lf = %lf\n", **x, **y, multiplication(**x, **y)); break;
        case '/':printf("%lf / %lf = %lf\n", **x, **y, division(**x, **y)); break;
        default:printf("bad operator!");
    }
    return 0;
}

void newcalc(char* restart,double* x, char* opp, double* y)
{
    while (restart != (char*)'N')
    {
        readcalc(&x, &opp, &y);
        switchfunk(&x, &opp, &y);
        printf("New Calc? (Y,N) \n");
        fflush(stdin);
        scanf("%c", &restart);
        if (restart != (char*)'Y'&&restart != (char*)'N')
        {
            printf("Bad input!");
        }
    }
}

double readcalc(double** x,char** opp,double** y)
{
    printf("\n Type your calculation!(z.B.4+7)\n");
    scanf("%lf%c%lf",x,opp,y);
    return 0;
}

double addition(double a,double b)
{
    double c = 0;
    c = a + b;
    return c;
}

double subtraction(double a, double b)
{
    double c = 0;
    c = a - b;
    return c;
}

double multiplication(double a, double b)
{
    double c = 0;
    c = a*b;
    return c;
}

double division(double a, double b)
{
    double c = 0;
    c = a / b;
    return c;
}

致以最良好的祝愿

您的代码中有很多问题,其中大部分与指针的使用有关。这里有一个问题:

在newcalc函数中,循环中有以下条件:

restart != (char*)'N'
这将不会像您期望的那样工作,事实上它将始终为真,并给您一个无限循环

原因是restart是一个指针,指向main函数中本地restart变量的位置。它永远不会与char*‘N’相同,它是指向地址78的指针

如何解决这个具体问题?首先,不要将其作为参数,将其声明为本地非指针!变量:

char restart = 'y';
然后在循环条件下正常使用它

while (restart == 'y' || restart == 'Y') { ... }
为了提示更多的指针问题,请记住,您想要一个指向存储值的变量的指针吗

但在例如readcalc函数中,变量x、opp和y是指向数据应存储位置的指针的指针,但您将这些指针传递给指向scanf的指针:

在这里,您应该使用指针作为readcalc函数的参数,而不是指向指针的指针

换句话说,它应该被宣布为

double readcalc(double*,char*,double*);

在不必要地使用指针和指向指针的指针时,您很可能会遇到许多其他问题,但这些问题才是真正突出的。

我认为您误用了指针和地址,而不是值本身。此外,您正在使用指向指针的指针,而不需要这样做。看看下面的代码

#include <stdio.h>
#include <stdlib.h>
void newcalc (char*,double*,char*,double*);
double switchfunk(double*, char*, double*);
double readcalc(double*,char*,double*);
double addition(double,double);
double subtraction(double,double);
double multiplication(double,double);
double division(double,double);

int main()
 {
    double a=0, b=0;
    char op='R', restart = 'Y';
    newcalc(&restart,&a,&op,&b);
    fflush(stdin);
    getchar();
return 0;
}
double switchfunk (double* x, char* opp, double* y)
{
    printf("\n ---CALCULATOR--- \n\n\n");
    switch ( *opp )
    {
        case '+':
                    printf("%lf + %lf = %lf\n", *x, *y, addition(*x, *y)); 
                    break;
        case '-':
                    printf("%lf - %lf = %lf\n", *x, *y, subtraction(*x, *y)); 
                    break;
        case '*':
                    printf("%lf * %lf = %lf\n", *x, *y, multiplication(*x, *y)); 
                    break;
        case '/':
                    printf("%lf / %lf = %lf\n", *x, *y, division(*x, *y));
                    break;
        default:printf("bad operator!");
    }

    return 0;
}
void newcalc(char* restart,double* x, char* opp, double* y)
{

    while ( *restart == 'Y' || *restart == 'y')
    {
        readcalc(x, opp, y);
        switchfunk(x, opp, y);
        printf("New Calc? (Y,N) \n");
        fflush(stdin);
        scanf("%c", restart);
        // if (restart != (char*)'Y'&&restart != (char*)'N')
        // {
            // printf("Bad input!");
        // }
    }
}

double readcalc(double* x,char* opp,double* y)
{
    printf("\n Type your calculation!(z.B.4+7)\n");
    scanf("%lf%c%lf",x,opp,y);
    return 0;
}

double addition(double a,double b)
{
    return a + b;
}
double subtraction(double a, double b)
{
    return a - b;
}
double multiplication(double a, double b)
{
    return a*b;
}
double division(double a, double b)
{
    return a / b;
}

为什么要传递指针,指针,指针,还有…这么多指针。只需传递char就足够了。这也会让您感到困惑。从技术上讲,在stdin上调用fflush是未定义的行为。有些平台定义了这种行为,但如果你想让你的代码可以移植,那就不要这样做。为什么你要在main函数中本地声明变量,并将它们作为指向newcalc函数的指针传递,不只是在需要的地方声明变量,例如在newcalc函数中本地声明变量,而是使用一些函数指针数组。使用所有警告和调试信息进行编译,例如gcc-Wall-g。了解如何使用调试器,例如gdbrestart是指向char的指针。他正在使用地址,而他应该取消引用它*重新启动以使用它。在函数内部重新启动newcalc@CroCo我质疑它是否需要成为一个指针,因为根本没有指针。正如不需要将其作为参数传递到函数中一样。
#include <stdio.h>
#include <stdlib.h>
void newcalc (char*,double*,char*,double*);
double switchfunk(double*, char*, double*);
double readcalc(double*,char*,double*);
double addition(double,double);
double subtraction(double,double);
double multiplication(double,double);
double division(double,double);

int main()
 {
    double a=0, b=0;
    char op='R', restart = 'Y';
    newcalc(&restart,&a,&op,&b);
    fflush(stdin);
    getchar();
return 0;
}
double switchfunk (double* x, char* opp, double* y)
{
    printf("\n ---CALCULATOR--- \n\n\n");
    switch ( *opp )
    {
        case '+':
                    printf("%lf + %lf = %lf\n", *x, *y, addition(*x, *y)); 
                    break;
        case '-':
                    printf("%lf - %lf = %lf\n", *x, *y, subtraction(*x, *y)); 
                    break;
        case '*':
                    printf("%lf * %lf = %lf\n", *x, *y, multiplication(*x, *y)); 
                    break;
        case '/':
                    printf("%lf / %lf = %lf\n", *x, *y, division(*x, *y));
                    break;
        default:printf("bad operator!");
    }

    return 0;
}
void newcalc(char* restart,double* x, char* opp, double* y)
{

    while ( *restart == 'Y' || *restart == 'y')
    {
        readcalc(x, opp, y);
        switchfunk(x, opp, y);
        printf("New Calc? (Y,N) \n");
        fflush(stdin);
        scanf("%c", restart);
        // if (restart != (char*)'Y'&&restart != (char*)'N')
        // {
            // printf("Bad input!");
        // }
    }
}

double readcalc(double* x,char* opp,double* y)
{
    printf("\n Type your calculation!(z.B.4+7)\n");
    scanf("%lf%c%lf",x,opp,y);
    return 0;
}

double addition(double a,double b)
{
    return a + b;
}
double subtraction(double a, double b)
{
    return a - b;
}
double multiplication(double a, double b)
{
    return a*b;
}
double division(double a, double b)
{
    return a / b;
}