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