十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
函数名的记忆应靠理解,不应该死记硬背。
创新互联-专业网站定制、快速模板网站建设、高性价比桐庐网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式桐庐网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖桐庐地区。费用合理售后完善,十余年实体公司更值得信赖。
在C语言中,需要使用的函数有多种,将他们分类,实际上,已经进行分类了,查看一下头文件即可。如
stdio.h --- standard input/output 标准输入输出头文件
string.h -- string 字符串
math.h -- 数学
conio.h -- console input/output 控制台头文件 等等 。
再如:
c语言中用到的输入输出函数
基本【scanf , printf】
控制台基本【 cscanf , cprintf】
字符串基本【 sscanf , sprintf 】
文件基本【 fscanf , fprintf 】 等等
单个字符操作: 【putc,getc】 【putchar,getchar】 【fputc,fgetc】 等等
字符串函数: strlen -- string length ; strcpy --- string copy ;
自己仔细分析就可举一反三。
这个问题涉及到词法份分析和语法分析,会比较复杂,如果有其他更好的实现,建议用其他更好的实现,比如手动地将源文件中的函数编入一个列表等等。如果真要分析一个.c源文件的函数,可以从以下几个方面设计:
用getcher()逐个字符读入并分析
统计花括号即{}的层次,从0层开始,遇到'{'层级加1,遇到'}'层级减1,函数定义和变量定义只会在最外层也就是第0层
函数定义通常有如下的形式(正则表达式)
/^[a-zA-Z_][a-zA-Z0-9_]?\s[a-zA-Z_][a-zA-Z0-9_]?(\s)? \( [a-zA-Z0-9_,/s]? \)
?代表0次或多次 \s表示任何形式空格,用正则表达式工具很易于实现。在最外层运用正则表达式工具或者手工编写识别器很容易识别。
但是这种识别只能适用于直接定义的函数,并且不能辨识和区分通过宏定义定义的函数以及调用宏的语句,且即使识别出了函数以及函数的签名,也不能通过c语言调用该函数。
获取不到,函数名在连接时被替换成函数入口地址,实际运行的程序中通常不存在函数名(PE文件如果有函数导出表则导出表中可能会记录函数名)。变量名同理。
在函数中需要函数名的地方写上 宏 __func__就可以了
#include stdio.h
const char* func1()
{
return __func__; //这语句类似return (char *)"func1";
}
void func2()
{
printf("call function %s\n", __func__);
}
int
main(void)
{
printf("function name %s\n", func1());
func2();
return(0);
}
运行结果:
function name func1
call function func2
这个用正则表达式会比较好吧。
大概这个样子:"[a-zA-Z]+\s+.+\(.*\)"
函数判断分函数声明、函数定义和使用的函数三种,我觉得判断第一种会比较准确,第二种有歧义需要细化,第三种无法判断(因为C语言太灵活,在没有支持库的情况下,C编译器自己也判断不出来的)
/* */ 主要是字符匹配的问题,检索 / 和 * ,如果检索到 * 和 / ,哨兵变量为 1 ,否则为 0 ;
//主要是检索到 / 和 / 就可以,以后这一行都是注释了。
头一个注释可以应用于 printf 中,后者不可以。
---------------------
以上均是个人理解,如有错误,请高手指正。