当前位置:首页 » 编程语言 » c语言实现函数映射
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言实现函数映射

发布时间: 2022-06-08 23:21:22

A. c语言编写函数实现以下功能,大写字母转换为对应的小写字母,小写字母转换为对应的大写字母

B. c语言如何实现函数的调用

如何调用C语言写的库,如a.lib等,有对应的库头文件a.h。假设a.h中定义了函数:
int
WhyCoding(int
a,
float
b);
做法是,
/*
cpp_a.h
*/
extern
"C"
{
#include
"a.h"
}

/*
cpp_a.h
*/
extern
"C"
{
int
WhyCoding(int
a,
float
b);
/*
重定义所有的C函数
*/
}
从上面可以看出,extern
"C"
是用在C和C++之间的桥梁。之所以需要这个桥梁是因为C编译器编译函数时不带
函数的类型信息,只包含函数符号名字,如C编译器把函数int
a(float
x)编译成类似_a这样的符号,C连接器只要
找到了调用函数的符号,就可以连接成功,它假设参数类型信息是正确的,这是C编译连接器的缺点。而C++
编译器为了实现函数重载,编译时会带上函数的类型信息,如他把上面的a函数可能编译成_a_float这样的
符号为了实现重载,注意它还是没有带返回值得信息,这也是为什么C++不支持采用函数返回值来区别函数
重载的原因之一,当然,函数的使用者对函数返回值的处理方式(如忽略)也是重要原因。
基于以上,C调用C++,首先需要用封装函数把对C++的类等的调用封装成C函数以便C调用,于是extern
"C"

作用是:让编译器知道这件事,然后以C语言的方式编译和连接封装函数.(通常是把封装函数用C++编译器按C++
方式编译,用了extern
"C"
后,编译器便依C的方式编译封装接口,当然接口函数里面的C++语法还是按C++方式
编译;对于C语言部分--调用者,还是按C语言编译;分别对C++接口部分和C部分编译后,再连接就可以实现C
调用C++了).
相反,C++调用C函数,extern
"C"
的作用是:让C++连接器找调用函数的符号时采用C的方式,即使用_a而不是
_a_float来找调用函数。

C. C语言函数的特点及其定义

C语言中一个函数(function)是一个可以从程序其它地方调用执行的语句块。

1、通过使用函数(functions)我们可以把我们的程序以更模块化的形式组织起来,从而利用C语言所支持的结构化程序设计。

2、从数学角度,函数即集合A和集合B之间的映射关系。实际上计算机中的函数概念也是源于此,因此,一般函数,都有形参和返回值。

3、从计算机组成原理的角度来看,函数即是一个小型的计算机系统,依据冯诺伊曼的“存储程序原理”,每一个计算机系统包含:输入系统、输出系统、运算器以及控制器,实际上对于C语言中的函数来说,它是“存储程序原理”的软实现,其中形参、实参这是输入系统,返回值是输出系统,函数体中的运算符,比如+、-、*、/四则运算即为运算器,而逻辑运算符以及if、while等控制语句便是一个控制器。

D. C语言。有一个函数y=x(x<1),y=2x-1(1<=x<10),y.=3x-11(x>=10)。写一段程序,输入x,输出y值。怎么做

有一个函数y=x(x<1),y=2x-1(1<=x=10)。一段程序如下:

E. 用C语言写出实现以下函数的对应程序,要求:输入X,计算并输出函数Y的值,保留两位小数。

#include<stdio.h>
float x,y;
void main()
{
printf("Please Input x:\n");
scanf("%f",&x);
if(x==0) y=20;
else if(x<0)
y=x+10;
else y=30*x;
printf("Y=%5.2f",y);
}

F. c语言中怎么实现键盘映射

呵呵,这种情况只能用全局钩子来做,用WH_KEYBOARD类型的键盘钩子就行。在Hook回调函数中修改虚拟键代码就行了~

大概的实现过程在下面讲一下:
先写一个DLL,全局钩子必须放在DLL中才能映射到所有进程的地址空间。
然后先定义回调函数,再定义两个导出函数,用于安装和卸载Hook

这个是回调函数原型,核心部分在这里,注意看哦
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);

重点注意wParam,这就是虚拟键代码,你可以判断这的虚拟键代码是否与a的虚拟键代码吻合,如果是,就把他改成b的虚拟键代码,只要该掉这个,你想要的功能就实现了。在函数的最后,别忘了返回CallNextHookEx函数的返回值。

关于Hook机制的详细资料,请看MSDN文档:
(en-us,VS.85).aspx

G. C语言的映射是什么

书的后面不是有讲,散列表就是一种映射。
数据的存储方式是按照key<->value。
key和value有种映射关系。
在散列表中key则是通过散列函数计算出来的。

H. 怎么使用C语言实现每隔一段时间执行一个函数

Windows提供了定时器,帮助编写定期发送消息的程序。定时器一般通过一下两中方式通知应用程序间隔时间已到。 ⑴ 给指定窗口发送WM_TIMER消息,也就是下面的给出在窗口类中使用的方法。 ⑵ 调用一个应用程序定义的回调函数,也就是在非窗口类中使用方法。 4.1 在窗口类中使用定时器 在窗口类中使用定时器比较简单。假如我们想让这个窗口上放置一个电子钟,这样我们必须每1秒或者0.5秒钟去更新显示显见。按照下面的步骤,就可以完成这个电子钟程序,并且知道如何在窗口类中使用定时器: 首先做在我们新建项目的主窗口上添加一个Label控件,用来显示时间。接着 ⑴ 用函数SetTimer设置一个定时器,函数格式如下: UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD)); 这个函数是CWnd类的一个成员函数,其参数意义如下: nIDEvent: 为设定的定时器指定的定时器标志值,设置多个定时器的时候,每个定时器的值都不同,消息处理函数就是通过这个参数来判断是哪个定时器的。这里我们设定为1。 nElapse: 指定发送消息的时间间隔,单位是毫秒。这里我们设定为1000,也就是一秒。 lpfnTimer: 指定定时器消息由哪个回调函数来执行,如果为空,WM_TIMER将加入到应用程序的消息队列中,并由CWnd类来处理。这里我们设定为NULL。 最后代码如下:SetTimer(1,1000,NULL); ⑵ 通过Class Wizard给主窗口类添加一个WM_TIMER消息的映射函数,默认为OnTimer(UINT nIDEvent)。 ⑶ 然后我们就可以在OnTimer(UINT nIDEvent)的函数实现中添加我们的代码了。参数nIDEvent就是我们先前设定定时器时指定的标志值,在这里我们就可以通过它来区别不同的定时器,而作出不同的处理。添加的代码如下:switch(nIDEvent) { case 1: CTime m_SysTime = CTime::GetCurrentTime(); SetDlgItemText(IDC_STATIC_TIME,m_SysTime.Format("%Y年%m月%d日 %H:%M:%S")); break; } 代码中的IDC_STATIC_TIME就是我们先前添加的Label控件的ID。 至此,我们的电子钟的程序就完成了。 4.2 在非窗口类中使用定时器 在非窗口类中使用定时器就要用到前面我们介绍到的所有知识了。因为是无窗口类,所以我们不能使用在窗口类中用消息映射的方法来设置定时器,这时候就必须要用到回调函数。又因为回调函数是具有一定格式的,它的参数不能由我们自己来决定,所以我们没办法利用参数将this传递进去。可是静态成员函数是可以访问静态成员变量的,因此我们可以把this保存在一个静态成员变量中,在静态成员函数中就可以使用该指针,对于只有一个实例的指针,这种方法还是行的通的,由于在一个类中该静态成员变量只有一个拷贝,对于有多个实例的类,我们就不能用区分了。解决的办法就是把定时器标志值作为关键字,类实例的指针作为项,保存在一个静态映射表中,因为是标志值是唯一的,用它就可以快速检索出映射表中对应的该实例的指针,因为是静态的,所以回调函数是可以访问他们的。 首先介绍一下用于设置定时的函数: UINT SetTimer( HWND hWnd, // handle of window for timer messages UINT nIDEvent, // timer identifier UINT uElapse, // time-out value TIMERPROC lpTimerFunc // address of timer procere ); 其中的参数意义如下: hWnd: 指定与定时器相关联的窗口的句柄。这里我们设为NULL。 nIDEvent: 定时器标志值,如果hWnd参数为NULL,它将会被跳过,所以我们也设定为NULL。 uElapse: 指定发送消息的时间间隔,单位是毫秒。这里我们不指定,用参数传入。 lpTimerFunc: 指定当间隔时间到的时候被统治的函数的地址,也就是这里的回调函数。这个函数的格式必须为以下格式: VOID CALLBACK TimerProc( HWND hwnd, // handle of window for timer messages UINT uMsg, // WM_TIMER message UINT idEvent, // timer identifier DWORD dwTime // current system time ); 其中的参数意义如下: hwnd: 与定时器相关联的窗口的句柄。 uMsg: WM_TIMER消息。 idEvent: 定时器标志值。 deTime: 系统启动后所以经过的时间,单位毫秒。 最后设定定时器的代码为:m_nTimerID = SetTimer(NULL,NULL,nElapse,MyTimerProc); 先通过Class Wizard创建一个非窗口类,选择Generic Class类类型,类名称为CMyTimer,该类的作用是每隔一段时间提醒我们做某件事情,然后用这个类创建三个实例,每个实例以不同的时间间隔提醒我们做不同的事情。 MyTimer.h#include class CMyTimer; //用模板类中的映射表类定义一种数据类型 typedef CMap CTimerMap; class CMyTimer { public: //设置定时器,nElapse表示时间间隔,sz表示要提示的内容 void SetMyTimer(UINT nElapse,CString sz); //销毁该实例的定时器 void KillMyTimer(); //保存该实例的定时器标志值 UINT m_nTimerID; //静态数据成员要提示的内容 CString szContent; //声明静态数据成员,映射表类,用于保存所有的定时器信息 static CTimerMap m_sTimeMap; //静态成员函数,用于处理定时器的消息 static void CALLBACK MyTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime); CMyTimer(); virtual ~CMyTimer(); }; MyTimer.cpp#include "stdafx.h" #include "MyTimer.h" //必须要在外部定义一下静态数据成员 CTimerMap CMyTimer::m_sTimeMap; CMyTimer::CMyTimer() { m_nTimerID = 0; } CMyTimer::~CMyTimer() { } void CALLBACK CMyTimer::MyTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime) { CString sz; sz.Format("%d号定时器:%s", idEvent, m_sTimeMap[idEvent]->szContent); AfxMessageBox(sz); } void CMyTimer::SetMyTimer(UINT nElapse,CString sz) { szContent = sz; m_nTimerID = SetTimer(NULL,NULL,nElapse,MyTimerProc); m_sTimeMap[m_nTimerID] = this; } void CMyTimer::KillMyTimer() { KillTimer(NULL,m_nTimerID); m_sTimeMap.RemoveKey(m_nTimerID); } 这样就完成了在非窗口类中使用定时器的方法。以上这些代码都在Windwos 2000 Professional 和 Visual C++ 6.0中编译通过

I. C语言中各种函数的具体作用,要详细点的

字符处理函数
本类别函数用于对单个字符进行处理,包括字符的类别测试和字符的大小写转换

头文件 ctype.h

函数列表<>
函数类别 函数用途 详细说明
字符测试 是否字母和数字 isalnum
是否字母 isalpha
是否控制字符 iscntrl
是否数字 isdigit
是否可显示字符(除空格外) isgraph
是否可显示字符(包括空格) isprint
是否既不是空格,又不是字母和数字的可显示字符 ispunct
是否空格 isspace
是否大写字母 isupper
是否16进制数字(0-9,A-F)字符 isxdigit
字符大小写转换函数 转换为大写字母 toupper
转换为小写字母 tolower

地区化
本类别的函数用于处理不同国家的语言差异。

头文件 local.h

函数列表
函数类别 函数用途 详细说明
地区控制 地区设置 setlocale
数字格式约定查询 国家的货币、日期、时间等的格式转换 localeconv

数学函数
本分类给出了各种数学计算函数,必须提醒的是ANSI C标准中的数据格式并不符合IEEE754标准,一些C语言编译器却遵循IEEE754(例如frinklin C51)

头文件 math.h

函数列表
函数类别 函数用途 详细说明
错误条件处理 定义域错误(函数的输入参数值不在规定的范围内)
值域错误(函数的返回值不在规定的范围内)
三角函数 反余弦 acos
反正弦 asin
反正切 atan
反正切2 atan2
余弦 cos
正弦 sin
正切 tan
双曲函数 双曲余弦 cosh
双曲正弦 sinh
双曲正切 tanh
指数和对数 指数函数 exp
指数分解函数 frexp
乘积指数函数 fdexp
自然对数 log
以10为底的对数 log10
浮点数分解函数 modf
幂函数 幂函数 pow
平方根函数 sqrt
整数截断,绝对值和求余数函数 求下限接近整数 ceil
绝对值 fabs
求上限接近整数 floor
求余数 fmod

本分类函数用于实现在不同底函数之间直接跳转代码。 头文件 setjmp.h io.h

函数列表
函数类别 函数用途 详细说明
保存调用环境 setjmp
恢复调用环境 longjmp

信号处理
该分类函数用于处理那些在程序执行过程中发生例外的情况。

头文件 signal.h

函数列表
函数类别 函数用途 详细说明
指定信号处理函数 signal
发送信号 raise

可变参数处理
本类函数用于实现诸如printf,scanf等参数数量可变底函数。

头文件 stdarg.h

函数列表
函数类别 函数用途 详细说明
可变参数访问宏 可变参数开始宏 va_start
可变参数结束宏 va_end
可变参数访问宏 访问下一个可变参数宏 va_arg

输入输出函数
该分类用于处理包括文件、控制台等各种输入输出设备,各种函数以“流”的方式实现

头文件 stdio.h

函数列表
函数类别 函数用途 详细说明
文件操作
删除文件 remove
修改文件名称 rename
生成临时文件名称 tmpfile
得到临时文件路径 tmpnam
文件访问 关闭文件 fclose
刷新缓冲区 fflush
打开文件 fopen
将已存在的流指针和新文件连接 freopen
设置磁盘缓冲区 setbuf
设置磁盘缓冲区 setvbuf
格式化输入与输出函数 格式输出 fprintf
格式输入 fscanf
格式输出(控制台) printf
格式输入(控制台) scanf
格式输出到缓冲区 sprintf
从缓冲区中按格式输入 sscanf
格式化输出 vfprintf
格式化输出 vprintf
格式化输出 vsprintf
字符输入输出函数 输入一个字符 fgetc
字符串输入 fgets
字符输出 fputc
字符串输出 fputs
字符输入(控制台) getc
字符输入(控制台) getchar
字符串输入(控制台) gets
字符输出(控制台) putc
字符输出(控制台) putchar
字符串输出(控制台) puts
字符输出到流的头部 ungetc
直接输入输出 直接流读操作 fread
直接流写操作 fwrite
文件定位函数 得到文件位置 fgetpos
文件位置移动 fseek
文件位置设置 fsetpos
得到文件位置 ftell
文件位置复零位 remind
错误处理函数 错误清除 clearerr
文件结尾判断 feof
文件错误检测 ferror
得到错误提示字符串 perror

实用工具函数
本分类给出了一些函数无法按以上分类,但又是编程所必须要的。

头文件 stdlib.h

函数列表
函数类别 函数用途 详细说明
字符串转换函数 字符串转换为整数 atoi
字符串转换为长整数 atol
字符串转换为浮点数 strtod
字符串转换为长整数 strtol
字符串转换为无符号长整型 strtoul
伪随机序列产生函数 产生随机数 rand
设置随机函数的起动数值 srand
存储管理函数 分配存储器 calloc
释放存储器 free
存储器分配 malloc
重新分配存储器 realloc
环境通信 中止程序 abort
退出程序执行,并清除环境变量 atexit
退出程序执行 exit
读取环境参数 getenv
程序挂起,临时执行一个其他程序 system
搜索和排序工具 二分查找(数据必须已排序) bsearch
快速排序 qsort
整数运算函数 求绝对值 abs
div
得到除法运算底商和余数
求长整形底绝对值 labs
求长整形除法的商和余数 ldiv
多字节字符函数 得到多字节字符的字节数 mblen
得到多字节字符的字节数 mbtowc
多字节字符转换 wctomb
多字节字符的字符串操作 将多字节串转换为整数数组 mbstowcs
将多字节串转换为字符数组 mcstowbs

字符串处理
本分类的函数用于对字符串进行合并、比较等操作

头文件 string.h

函数列表
函数类别 函数用途 详细说明
字符串拷贝 块拷贝(目的和源存储区不可重叠) memcpy
块拷贝(目的和源存储区可重叠) memmove
串拷贝 strcpy
按长度的串拷贝 strncpy
字符串连接函数 串连接 strcat
按长度连接字符串 strncat
串比较函数 块比较 memcmp
字符串比较 strcmp
字符串比较(用于非英文字符) strcoll
按长度对字符串比较 strncmp
字符串转换 strxfrm
字符与字符串查找 字符查找 memchr
字符查找 strchr
字符串查找 strcspn
字符串查找 strpbrk
字符串查找 strspn
字符串查找 strstr
字符串分解 strtok
杂类函数 字符串设置 memset
错误字符串映射 strerror
求字符串长度 strlen

日期和时间函数
本类别给出时间和日期处理函数

头文件 time.h

函数列表
函数类别 函数用途 详细说明
时间操作函数 得到处理器时间 clock
得到时间差 difftime
设置时间 mktime
得到时间 time
时间转换函数 得到以ASCII码表示的时间 asctime
得到字符串表示的时间 ctime
得到指定格式的时间 strftime

函数库未来的发展方向
本部分用于说明各类别函数库在将来如何发展。

序号 库类别 头文件 详细说明
1 错误处理 errno.h
2 字符处理 ctype.h
3 地区化 local.h
4 数学函数 math.h
5 信号处理 signal.h
6 输入输出 stdio.h
7 实用工具程序 stdlib.h
8 字符串处理 string.h