简单计算器的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就是函数指针 ...
随机推荐
- Spring MVC使用Cors实现跨域
在开发APP过程中,APP调用后端接口有跨域的问题,只要在spring-mvc.xml 文件中加入下面的配置即可: <!-- 解决API接口跨域问题配置 Spring MVC 版本必须是 4.2 ...
- OCR论文整理
论文地址:https://github.com/ChanChiChoi/awesome-ocr 下面是已经看过的论文: CTPN CRNN TextBoxes EAST FOTS PixelLink
- Eureka的一些注意事项
1.心跳设置:只能在application.yml中 2. 注册到Eureka上面的服务名称 与swagger2使用的时候,需要配置此项,否则显示服务名称为unknown 3.高可用的Eureka 4 ...
- mysql 设置默认编码为 utf8
vi /etc/mysql/mysql.conf.d/mysqld.cnf [client] default-character-set=utf8 [mysql] default-character- ...
- webapi框架搭建-安全机制(一)
本系列博客链接:webapi框架搭建系列博客 前言 webapi接口是开放给外部使用的,包括接口的地址,传参的规范,还有返回结果的说明.正因为接口的开放性,使得接口的安全很重要.试想一下,用抓包工具( ...
- 悬浮按钮css
.floating-button { color: #fff; position: absolute; right: 16px; bottom: 88px; width: 56px; height: ...
- typora快捷键之速成笔记
使用心得:用起来相当的顺手,强烈推荐小伙伴使用该工具,内置快捷功能很贴心 工具下载: https://download.csdn.net/download/lele508994993/10392197 ...
- java正则:不包含某个规则字符串【转】
概述 做日志分析工作的经常需要跟成千上万的日志条目打交道,为了在庞大的数据量中找到特定模式的数据,常常需要编写很多复杂的正则表达式.例如枚举出日志文件中不包含某个特定字符串的条目,找出不以某个特定字符 ...
- ul标签的高度为0
由于项目中使用ul+li的布局方式,在ie8.chrome浏览器中,包裹浮动的li元素的外层ul高度为0,ie7浏览器和ie8兼容模式显示正常,这是典型的浏览器兼容性问题. 解决办法: 第一种:设置u ...
- 点击搜索条件提交form表单
思路:点击搜索,javascript跳转提交方法,提交整个表单. //组员下拉框选择分组事件 $('#s-member').change(function(){ $('#logForm').submi ...