工具/材料
創(chuàng)新互聯(lián)于2013年創(chuàng)立,先為愛民等服務建站,愛民等地企業(yè),進行企業(yè)商務咨詢服務。為愛民企業(yè)網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。
Ubuntu16.04
gcc+vim
01
打開Ubuntu,并在目標路徑下開啟一個終端。
02
選定一個路徑,使用touch命令創(chuàng)建三個文件,function.h,function.c,test.c,分別用來做函數(shù)頭文件、函數(shù)源文件以及測試文件
03
這里以四則運算函數(shù)為例說明函數(shù)的編寫流程與調用流程。首先用vim命令與vsplit依次打開三個文件。
04
在頭文件中添加重復包含的宏,并添加四則運算的函數(shù)聲明。
05
在function.c中將function.h包含進來,并具體實現(xiàn)四個方法。注意出發(fā)要對除數(shù)是否為0進行判斷。
06
然后編寫測試程序進行測試。總的程序代碼如下:
07
保存所有的程序并退出,使用gcc進行編譯,并運行得到的結果如下。這就是函數(shù)的聲明、定義以及調用。
問題出在沒有貼出的代碼上。
每次讀取數(shù)字或字符時,要多讀一個字符(把輸入時的“回車符”讀取掉,不讓它留在緩沖區(qū)中)
可以參考下面的代碼:
#include windows.h
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
while(1)
{
MessageBox(NULL,"FYY,我想我是喜歡上你了","CKR",MB_OK);
}
return 0;
}
注:彈出窗口之后會一直顯示。
擴展資料:
C語言參考函數(shù)
C語言isprint()函數(shù):判斷一個字符是否是可打印字符
C語言islower()函數(shù):判斷一個字符是否是小寫字母
C語言ldexp()函數(shù):返回x乘以2的exponent次方(次冪)的值
C語言labs()函數(shù):求整數(shù)的絕對值(針對long類型)
C語言isgraph()函數(shù):判斷一個字符是否是圖形字符
double fabs(double x) 返回雙精度參數(shù)x的絕對值
long labs(long n) 返回長整型參數(shù)n的絕對值
double exp(double x) 返回指數(shù)函數(shù)ex的值
參考資料來源:百度百科-C語言函數(shù)
參考資料來源:百度百科-c語言
例子代碼如下所示:
int Add(int x, int y) { ? ?int sum;
sum = x + y; ? ?return sum;
}void main() { ? ?int z;
z = Add(1, 2); ? ?printf("z=%d\n", z);
}
下面分析一下 Add函數(shù)的調用過程。
首先斷點在z = Add(1, 2);處, 反匯編如下所示:
int z;
z = Add(1, 2);002C141E 6A 02 ? ? ? ? ? ? ? ?push ? ? ? ?2 ?002C1420 6A 01 ? ? ? ? ? ? ? ?push ? ? ? ?1 ?002C1422 E8 60 FC FF FF ? ? ? call ? ? ? ?002C1087 ?
002C1427 83 C4 08 ? ? ? ? ? ? add ? ? ? ? esp,8 ?002C142A 89 45 F8 ? ? ? ? ? ? mov ? ? ? ? dword ptr [ebp-8],eax
首先壓入參數(shù)1和2:
002C141E 6A 02 ? ? ? ? ? ? ? ?push ? ? ? ?2 ?002C1420 6A 01 ? ? ? ? ? ? ? ?push ? ? ? ?1 ?
通過觀察ESP可以看到參數(shù)從右到左依次入棧,ESP往低內存方向移動8字節(jié):
ESP=0025FCCC
...0x0025FCAA ?00 00 78 4c 33 00 bc fc 25 00 a9 fe aa 0f 78 4c 33 00 c8 fc 25 00 3d 5a b2 0f *** 01 00 00 00 02 00 00 00 ***0x0025FCCC ?00 00 00 00
首先,我不知道你申請char m,n是做什么用的,所以這一句刪掉了。
其次,scanf函數(shù)應該這樣寫:scanf("%d,%d",a,b);但這樣寫的話,你輸入兩個數(shù)字之間必須輸入一個逗號。
建議寫成scanf("%d%d",a,b); 這樣的話,兩個數(shù)字之間輸入空格就可以了
修改后的代碼如下:
#include stdio.h
#includeconio.h
int sum(int x,int y)
{ int z;
z=x+y;
printf("z=%d",z);
return 0;
}
main()
{
int a,b,s;
scanf("%d,%d",a,b);
s=sum(a,b);
}
加上是因為scanf需要知道參數(shù)a,b的地址。a表示的就是a的地址,同理b也是
補充:lz的追問意思是不是我為什么把sum函數(shù)的代碼改成return 0?
如果是這個意思,那我回答你:return表示從被調函數(shù)返回到主調函數(shù)繼續(xù)執(zhí)行,返回時可附帶一個返回值,由return后面的參數(shù)指定。如果函數(shù)執(zhí)行不需要返回計算結果,也經常需要返回一個狀態(tài)碼來表示函數(shù)執(zhí)行的順利與否(-1和0就是最常用的狀態(tài)碼,-1代表異常,0代表正常)。
因為你需要輸出的結果已經在函數(shù)里打印出來了。其實return z的真正作用可以在如下的代碼中表示出來,可以這樣:
#include stdio.h
#includeconio.h
int sum(int x,int y)
{ int z;
z=x+y;
return z;
}
main()
{
int a,b,s;
scanf("%d,%d",a,b);
s=sum(a,b);
printf("s=%d",s);
}
這段代碼必須有 return z;,因為是在main函數(shù)里輸出,需要函數(shù)返回值來給s賦值。
#define N 3
struct ex
{
char name;
char num;
double s[N];
};
以上這幾行要挪到你的頭文件的最開頭。
代碼里的%f要改為%lf。
這樣,編譯就不會報錯了。
但一運行程序就會崩潰,因為還有兩個問題:
1)
int main()
{
struct ex *p;
myname(p);
}
要改成:
int main()
{
struct ex p;
myname(p);
}
2)
char name; ---》只有一個字節(jié)的空間,不論怎么輸入都會內存越界,最好改用char數(shù)組
char num;---》只有一個字節(jié)的空間,不論怎么輸入都會內存越界,最好改用char數(shù)組