c语言 怎么将字符串代入函数,通过函数名字符串调用函数【C语言版】
问题引入
在C中,函数先定义,后使用。举个简单的例子
/************************
* add by oscar999
************************/
func1()
{
printf("this is func1!\n");
}
void main()
{
func1();
}
定义了一个简单的函数func1, 调用的时候只需要"函数名()" 的方式就可以调用的到。(至于调用的过程是如何处理的,就要参考汇编的知识了。)
但是,在实际的开发过程中可能会遇到这种情况, 函数名事先并不确定,函数名是通过一个字符串变量保存的,这种状况该如何调用呢?
更具体一点的例子,函数名是通过外部输入进去了。
/************************
* add by oscar999
************************/
void func1()
{
printf("this is func1!\n");
}
void main()
{
char c[20] = "\0";
printf("please input func name:");
scanf("%s",c); //input func1
//how run func1 ???
}
该如何执行func1呢?
函数指针
解决以上问题之前, 首先引入函数指针的概念。
在C语言中,某一数据变量的内存地址可以存储在相应的指针变量中,比如 int * , char * 等,
对于函数来说,也同样如此,函数的首地址也可以存储在某个函数指针变量里,通过这个函数指针变量我们就可以调用所指向的函数了。
如何定义函数指针变量? 很简单。
对应到上面 func1 函数,可以定义如下的指针变量。
void (*funcP)()
funcP这个名字可以随便取。以下例子通过函数指针调用函数。
/************************
* add by oscar999
************************/
func1()
{
printf("this is func1!\n");
}
void main()
{
void (*funcP)();
funcP = &func1;
(*funcP)();
}
使用函数指针实现函数名字符串调用函数
有了如上的例子,不难想到:
如果我们事先定义一些函数指针,通过传入的函数名字串,得到相应的函数指针,就可以实现函数调用了。
/************************
* add by oscar999
************************/
#include
typedef void (*funcP)();
void func1()
{
printf("this is func1!\n");
}
void func2()
{
printf("this is func2!\n");
}
funcP getFuncPointer(char* sfuncname)
{
if(strcmp(sfuncname,"func1")==0)
{
return &func1;
}else if(strcmp(sfuncname,"func2")==0){
return &func2;
}
return NULL;
}
void main()
{
char c[20] = "\0";
funcP funcp = NULL;
printf("please input func name:");
scanf("%s",c); //input func1 or func2
funcp = getFuncPointer(c);
if(funcp!=NULL)
{
(*funcp)();
}
}
你可能会想,通过传入的string 直接调用对应的function不就可以了吗?类似:
/************************
* add by oscar999
************************/
#include
typedef void (*funcP)();
void func1()
{
printf("this is func1!\n");
}
void func2()
{
printf("this is func2!\n");
}
void main()
{
char c[20] = "\0";
funcP funcp = NULL;
printf("please input func name:");
scanf("%s",c); //input func1 or func2
if(strcmp(c,"func1")==0)
{
func1();
}else if(strcmp(c,"func2")==0){
func2();
}
}
以上这种对于 function 较少的状况可以使用, 但是func很多的话, 或者动态的生成这部分的话,指针函数的方式就很好了。
实际设计师,可以把 函数名字串和函数指针放到一个name value set 中去, 这样就可以很容易得到函数指针了。
带参数的状况
c语言 怎么将字符串代入函数,通过函数名字符串调用函数【C语言版】相关推荐
- 编写一个C程序,实现以下功能:编写一个函数decTobin(int n),该函数能将一个十进制数n转换成二进制数,输入13 输出 1101。在main函数中输入整数n,调用函数,输出它的二进制
题目要求: 编写一个C程序,实现以下功能: //编写一个函数decTobin(int n),该函数能将一个十进制数n转换成二进制数,输入13 输出 1101. //在main函数中输入整数n,调用函数 ...
- 函数定义、函数参数、跨脚本调用函数
2.6.函数使用 函数定义 示例(文件名称为func1.sh): #!/bin/bash ##定义函数 hello() { echo "Hello there today's date is ...
- php new对象 调用函数,关于JS中new调用函数的原理介绍
这篇文章主要介绍了关于JS中new调用函数的原理介绍,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 JavaScript 中经常使用构造函数创建对象(通过 new 操作符调用一个函数) ...
- linux dlopen函数,dlopen 和 dlsym 动态调用函数
Linux/unix 提供了使用 dlopen 和 dlsym 方法动态加载库和调用函数,这套方法在 macOS 和 iOS 上也支持. dlopen 打开一个库,获取句柄. dlsym 在打开的库中 ...
- matlab调用函数出错,[MATLAB基础] matlab 调用函数老是出错怎么回事??高手请指点一下...
matlab 调用函数老是出错怎么回事??高手请指点一下 function main() for w2=1:1:100 %生成一个区间 p1=w2; p2=p1+1; eps=1.0e-4; y=er ...
- C语言:对输入的一个数判断是否是素数。所谓素数是指这个数只能被1和自身整除。要求在主函数输入一个数,调用函数Fun()判断该数是否是素数。
话不多说直接上代码: #include <stdio.h> int Fun(int m); //函数原型声明 int main() {int m, flag;printf("Pl ...
- C语言,向函数传递一维数组,调用函数并计算平均成绩
代码如下: 说明:编译器为vs,所以使用的是scanf_s #include <stdio.h> #define N 40 int Average(int score[], int n); ...
- C语言用函数求圆的面积和周长,用C语言:编写两个函数,分别计算圆的面积和周长,要求在主函数中输入半径,调用函数进行计算,主函数中...
满意答案 deboia27 2016.05.19 采纳率:42% 等级:7 已帮助:458人 12345678910111213141516171819202122232425请采纳:#incl ...
- java 函数后面 throws_java – 为什么在调用函数时需要“throws Exception”?
在Java中,你可能知道,异常可以分为两个:一个需要throws子句,或者必须处理,如果你没有指定一个和另一个.现在,见下图: 在Java中,你可以抛出任何扩展Throwable类的东西.但是,您不需 ...
- c语言函数名本质是指针,C语言的本质(12)——指针与函数
往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂.下面详细为大家介绍C语言中指针函数和函数指针. 1.指针函数 当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需 ...
最新文章
- 降维处理:PCA和LDA
- 数人云轻量级PaaS将弹性做到极致
- 社区v2022.3版上线:发帖、看直播、评论体验升级,并支持机构号申请
- pppoe设计的一般性
- 随笔:项目感想、知识总结、未来展望
- MySQL中如何删除数据
- Python只需要三十行代码,打造一款简单的人工语音对话
- CSS边框,背景,边距,溢出
- Replace Type Code with Subclasses(以子类取代类型码)
- [转]关于支付宝API开发的一点心得
- Magicodes.Admin.Core开源框架总体介绍
- @程序员,你真的懂数据可视化吗?
- 《版式设计——日本平面设计师参考手册》—第1章段落样式和字符样式的基础知识...
- 微信公众平台自动回复详解
- 排列怎么用计算机计算公式,数学排列组合公式计算器
- 【GEEK】win10下cmd美化
- 华为云Web应用防火墙 ——为网络安全打通“第一公里”
- MyLinearLayout 之 初级学习经验
- 小程序如何关联企业微信
- RK3399 ,64位,Ubuntu16.04系统安装ROS-kinetic方法总结