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;
}