问题引入

在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语言版】相关推荐

  1. 编写一个C程序,实现以下功能:编写一个函数decTobin(int n),该函数能将一个十进制数n转换成二进制数,输入13 输出 1101。在main函数中输入整数n,调用函数,输出它的二进制

    题目要求: 编写一个C程序,实现以下功能: //编写一个函数decTobin(int n),该函数能将一个十进制数n转换成二进制数,输入13 输出 1101. //在main函数中输入整数n,调用函数 ...

  2. 函数定义、函数参数、跨脚本调用函数

    2.6.函数使用 函数定义 示例(文件名称为func1.sh): #!/bin/bash ##定义函数 hello() { echo "Hello there today's date is ...

  3. php new对象 调用函数,关于JS中new调用函数的原理介绍

    这篇文章主要介绍了关于JS中new调用函数的原理介绍,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 JavaScript 中经常使用构造函数创建对象(通过 new 操作符调用一个函数) ...

  4. linux dlopen函数,dlopen 和 dlsym 动态调用函数

    Linux/unix 提供了使用 dlopen 和 dlsym 方法动态加载库和调用函数,这套方法在 macOS 和 iOS 上也支持. dlopen 打开一个库,获取句柄. dlsym 在打开的库中 ...

  5. matlab调用函数出错,[MATLAB基础] matlab 调用函数老是出错怎么回事??高手请指点一下...

    matlab 调用函数老是出错怎么回事??高手请指点一下 function main() for w2=1:1:100 %生成一个区间 p1=w2; p2=p1+1; eps=1.0e-4; y=er ...

  6. C语言:对输入的一个数判断是否是素数。所谓素数是指这个数只能被1和自身整除。要求在主函数输入一个数,调用函数Fun()判断该数是否是素数。

    话不多说直接上代码: #include <stdio.h> int Fun(int m); //函数原型声明 int main() {int m, flag;printf("Pl ...

  7. C语言,向函数传递一维数组,调用函数并计算平均成绩

    代码如下: 说明:编译器为vs,所以使用的是scanf_s #include <stdio.h> #define N 40 int Average(int score[], int n); ...

  8. C语言用函数求圆的面积和周长,用C语言:编写两个函数,分别计算圆的面积和周长,要求在主函数中输入半径,调用函数进行计算,主函数中...

    满意答案 deboia27 2016.05.19 采纳率:42%    等级:7 已帮助:458人 12345678910111213141516171819202122232425请采纳:#incl ...

  9. java 函数后面 throws_java – 为什么在调用函数时需要“throws Exception”?

    在Java中,你可能知道,异常可以分为两个:一个需要throws子句,或者必须处理,如果你没有指定一个和另一个.现在,见下图: 在Java中,你可以抛出任何扩展Throwable类的东西.但是,您不需 ...

  10. c语言函数名本质是指针,C语言的本质(12)——指针与函数

    往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂.下面详细为大家介绍C语言中指针函数和函数指针. 1.指针函数 当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需 ...

最新文章

  1. 降维处理:PCA和LDA
  2. 数人云轻量级PaaS将弹性做到极致
  3. 社区v2022.3版上线:发帖、看直播、评论体验升级,并支持机构号申请
  4. pppoe设计的一般性
  5. 随笔:项目感想、知识总结、未来展望
  6. MySQL中如何删除数据
  7. Python只需要三十行代码,打造一款简单的人工语音对话
  8. CSS边框,背景,边距,溢出
  9. Replace Type Code with Subclasses(以子类取代类型码)
  10. [转]关于支付宝API开发的一点心得
  11. Magicodes.Admin.Core开源框架总体介绍
  12. @程序员,你真的懂数据可视化吗?
  13. 《版式设计——日本平面设计师参考手册》—第1章段落样式和字符样式的基础知识...
  14. 微信公众平台自动回复详解
  15. 排列怎么用计算机计算公式,数学排列组合公式计算器
  16. 【GEEK】win10下cmd美化
  17. 华为云Web应用防火墙 ——为网络安全打通“第一公里”
  18. MyLinearLayout 之 初级学习经验
  19. 小程序如何关联企业微信
  20. RK3399 ,64位,Ubuntu16.04系统安装ROS-kinetic方法总结

热门文章

  1. c语言题目 ppt怎么做,C语言学生题目.ppt
  2. c语言排序程序ppt,冒泡排序 ---C语言程序设计.ppt
  3. OleDbCommand 的用法
  4. Visio中插入竖直省略号方法
  5. 如何用3dmax建成人的模型
  6. 深挖Openstack Cinder - CLI命令(3)
  7. SpringBoot+jsp高校会议室预约系统java ssm多媒体教室管理系统
  8. 磁盘删除分区(还原)方法
  9. 蓝牙耳机什么牌子好?高性价比蓝牙耳机品牌推荐
  10. Symbols和Iterators 和 Generators