简单计算器的C实现-函数指针,main函数传参
/*
* 程序功能:简单计算器,实现加减乘除平方
* 作者版本日期:2015.11.08 zhouhb OK
* 源代码:李明 《新概念C语言培训》第33集 C语言Shell命令解释器的实现
* 代码存储位置 :133 /home/zhouhb/test/calculator.c
* 整体思路:函数指针,main函数传参
*/
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int m_debug = 0;
int (*pf)(int ,int);
char opchar_math;//打印运算符
//函数和名字对应
struct operation{
char name[8];
int (*pf)(int,int);
char opchar;
};
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;
}
int divi(int a,int b)//div是C的函数
{
if(b<=0)
return 0;
return a/b;
}
int power(int a,int b)
{
int i = 0,num = 1;
for(i=0;i<b;i++)
{
num = num * a;
}
return num;
}
struct operation op[]={
{"add",add,'+'},
{"sub",sub,'-'},
{"mul",mul,'*'},
{"div",divi,'/'},
{"pow",power,'^'}
};
int math(int argc,char *argv[])
{
int a=0,b=0,num=0;
int result;
a = atoi(argv[1]);
b = atoi(argv[2]);
result = pf(a,b);
printf("%d %c %d = %d\n",a,opchar_math,b,result);
}
//函数和函数指针对应
int command_do(int argc,char* argv[])
{
#if 0
if(strncmp(argv[0],"add",3)==0)
pf = add;
if(strncmp(argv[0],"sub",3)==0)
pf = sub;
if(strncmp(argv[0],"mul",3)==0)
pf = mul;
if(strncmp(argv[0],"divi",4)==0)
pf = divi;
if(strncmp(argv[0],"pow",3)==0)
pf = power;
#endif
int i = 0;
for(i = 0;i<sizeof(op)/sizeof(op[0]);i++)
{
if(strcmp(argv[0],op[i].name)==0)
{
pf = op[i].pf;
opchar_math = op[i].opchar;
break;
}
}
math(argc,argv);
}
//模拟main对输入进行处理
void shell_parse(char* buff)
{
int argc = 0;
char *argv[8];
int state = 0;
int i = 0;
while(*buff)
{
char c = *buff;
if(c == ' '&&state == 0)//" add 100"开始有空格
state = 0;
else if(c != ' '&& state == 0)//"add 100"解析第一个
{
argv[argc++] = buff;
state = 1;
}
else if(c == ' ' && state ==1)//"a dd 100"解析完add遇到空格
{
*buff = '\0';
state = 0;
}
else if(c != ' '&&state == 1)//"add 100"解析add中d
{
state = 1;
}
buff++;
if(*buff == '\n')//传入有回车
*buff = '\n';
}
argv[argc] = NULL;//避免出现乱编
if(m_debug==1)
{
printf("argc = %d\n",argc);
for(i=0;i<argc;i++)
{
printf("argv[%d]:%s\n",i,argv[i]);
}
}
command_do(argc,argv);
}
int main(int argc,char* argv[],char* env[])
{
int i=0;
char buff[254];
int num=0;
if(argc >1 && strlen(argv[1])>1 && strncmp(argv[1],"-d",2)==0)
m_debug = 1;
printf("input name num1 num2\n");
while(1)
{
printf("NCCL#");
fgets(buff,254,stdin);//不用scanf,gets
if(m_debug)
printf("buff=%s\n",buff);
shell_parse(buff);
}
#if 0
printf("argc = %d\n",argc);
for(i=0;i<argc;i++)
{
printf("argv[%d]:%s\n",i,argv[i]);
}
for(i=0;i<=3;i++)
printf("env[%d]:%s\n",i,env[i]);
#endif
}
简单计算器的C实现-函数指针,main函数传参的更多相关文章
- C++中的二级指针和指针引用函数传参
在函数的使用过程中,我们都明白传值和传引用会使实参的值发生改变.那么能够通过传指针改变指针所指向的地址吗? 在解决这个问题之前,也许我们应该先了解指针非常容易混淆的三个属性: ①.指针变量地址(&am ...
- VC与JavaScript交互(三) --- CWebPage类调用javascript函数(给js函数传参,并取得返回值)
①需要一个别人写好的类CWebPage,将其对于的两个文件WebPage.h和WebPage.cpp添加到工程中. ②添加WebBrowser控件,在视图/对话框类的头文件中#include &quo ...
- VC/MFC中通过CWebPage类调用javascript函数(给js函数传参,并取得返回值)
转自:http://www.cnblogs.com/javaexam2/archive/2012/07/14/2632959.html ①需要一个别人写好的类CWebPage,将其对于的两个文件Web ...
- C语言函数指针实验
上次看Atmel的示例工程,发现人家使用了函数指针的结构体(函数指针结构体).感叹人家的C语言功夫审核,自己费劲还是只能读懂的份.不过,函数指针确实好用.今天就试试这个超牛的东西.Now let's ...
- C语言函数指针基础
本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C ...
- C语言函数指针和回调函数
彻底搞定C指针-函数名与函数指针 函数名&函数名取地址 函数指针 通常我们可以将指针指向某类型的变量,称为类型指针(如,整型指针).若将一个指针指向函数,则称为函数指针. 函数名的意义 函数名 ...
- python笔记之强制函数以关键字参数传参
最近学习python,学到了函数传参,看到了以下这个特殊情况,特此来做个笔记 def add(*, x, y): print(x, y) 以上函数定义后,该怎么传参?前面的那个*号是做什么用的? 我们 ...
- c语言的函数指针和函数指针数组的简单demo
今天,简单记录一下,函数指针和函数指针数组的使用,废话不多说,直接贴上代码,里面有详细的注释,方便以后查阅. #include <cstdio> #include <Windows. ...
- C函数指针简单用例
(1)函数指针:可以指向 一类 固定形参类型和返回值类型 的函数 的指针声明:int fun(int, int) || \/int (*pfun)(int, int) pfun就是函数指针 ...
随机推荐
- bzoj3839【Pa2013】Działka
题目描述 平面上有n个不重复的点.每次询问一个边平行坐标轴的矩形内(包含边界)的点组成的凸包的面积.. 输入格式 第一行两个整数k,n(1<=k<=1000000,3<=n<= ...
- 从function的定义看JavaScript的预加载
在JavaScript中定义一个函数,有两种写法: function ftn(){} // 第一种 var ftn = function(){} // 第二种 有人说,这两种写法是完全等价的.但是在解 ...
- Cannot enlarge string buffer containing XX bytes by XX more bytes
在ELK的数据库报警系统中,发现有台机器报出了下面的错误: 2018-12-04 18:55:26.842 CST,"XXX","XXX",21106,&quo ...
- Java基础-Date类常用方法介绍
Java基础-Date类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.毫秒值概念 我们在查阅Date类的API文档时,会发现这样的一句话:"The cl ...
- servlet拦截器
servlet拦截未登录的用户请求 java代码: package com.gavin.filter; import java.io.IOException; import javax.servlet ...
- Java事件基础
package cn.Douzi.Event; import javax.swing.*; import java.awt.*; import java.awt.event.*; public cla ...
- 织梦自定义表单通过ajax提交的实现方法
自定义表单通过ajax判断,提交不用跳转页面,提高用户体验.具体方法如下: html表单代码部分,就提交按钮改成botton,,添加onclick事件 表单代码: <form action=&q ...
- linux scp上传文件到其他机器上
scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...
- 《设计模式》-原则四:接口隔离原则(ISP)
啊!天气很热啊,回来洗个澡,做个饭吃完后 又出了一身汗,真后悔先洗澡. 加油坚持学习,今天要学的是“接口隔离原则” 意思是说:在设计的时候使用多个专门的接口比使用一个总的接口好很多.一个类对另一个类的 ...
- window对象中的一些重要的属性和方法(笔记)
setTimeout()方法用来实现一个函数在指定的毫秒数之后运行:setTimeout()返回一个值,这个值可以传递给clearTimeout()用于取消这个函数的执行.由于历史原因,setTime ...