结构体和函数指针实现加减乘除
构思:
创建结构体,结构体的成员中有⼀个成员为函数指针,赋值后可指向各个算法的地址;
当输⼊add 1 2时,指针数组分别指向add,1和2;
随后进⾏字符串⽐较,判断进⼊哪⼀个算法;
实现:
char optr;
int(*pf)(int, int) = NULL;      //函数指针
sizeof 指针
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
struct operation
{
char *name;
int(*pf)(int, int);  //结构体的成员为⼀个函数指针
char c;
}ops[] = {
{ "add", add, '+' },
{ "sub", sub, '-' },
{ "mul", mul, 'X' }
};
void math_man(char *buf[], int num)
{
int a = atoi(buf[1]);
int b = atoi(buf[2]);
int r = pf(a, b);
printf("%s%c%s=%d\n", buf[1], optr,buf[2], r);
}
void do_action(char *pbuff[], int num)
{
int i = 0;
for (i = 0; i < sizeof(ops) / sizeof(ops[0]); i++)
{
if (strcmp(pbuff[0], ops[i].name) == 0)    //判断字符串
{
pf = ops[i].pf;    //函数指针指向
optr = ops[i].c;  //optr指向算术符
break;
}
}
math_man(pbuff,num);
}
void parse(char *buff1)
{
int num = 0;;
int i = 0;
char *str[3];      //数组指针指向三个字符串的地址
int status = 0;
for (i = 0; buff1[i] != '\0'; i++)
{
if (!isspace(buff1[i])&&(status == 0))  //记录字符串的位置
{
status = 1;      //可以让buff1[0] 指向add  buff1[1] buff1[2]分别指向后⾯的两个数字
str[num++] = buff1+i;
}
else if(isspace(buff1[i]))    //遇到空格则下⼀个位置是下⼀个字符串的起始位置,并截断上⼀个字符串的末尾        {
status = 0;
buff1[i] = '\0';
}
}
do_action(str, num);
do_action(str, num);
}
int main()
{
char buff[200] ;
while (1)
{
printf("input>:");
scanf("%[^\n]%*c",buff);
parse(buff);
memset(buff, 0x00, sizeof(buff));//每次读取后进⾏初始化以免发⽣冲突    }
system("pause");
return0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。