工具/材料
创新互联于2013年创立,先为爱民等服务建站,爱民等地企业,进行企业商务咨询服务。为爱民企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
Ubuntu16.04
gcc+vim
01
打开Ubuntu,并在目标路径下开启一个终端。
02
选定一个路径,使用touch命令创建三个文件,function.h,function.c,test.c,分别用来做函数头文件、函数源文件以及测试文件
03
这里以四则运算函数为例说明函数的编写流程与调用流程。首先用vim命令与vsplit依次打开三个文件。
04
在头文件中添加重复包含的宏,并添加四则运算的函数声明。
05
在function.c中将function.h包含进来,并具体实现四个方法。注意出发要对除数是否为0进行判断。
06
然后编写测试程序进行测试。总的程序代码如下:
07
保存所有的程序并退出,使用gcc进行编译,并运行得到的结果如下。这就是函数的声明、定义以及调用。
问题出在没有贴出的代码上。
每次读取数字或字符时,要多读一个字符(把输入时的“回车符”读取掉,不让它留在缓冲区中)
可以参考下面的代码:
#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语言参考函数
C语言isprint()函数:判断一个字符是否是可打印字符
C语言islower()函数:判断一个字符是否是小写字母
C语言ldexp()函数:返回x乘以2的exponent次方(次幂)的值
C语言labs()函数:求整数的绝对值(针对long类型)
C语言isgraph()函数:判断一个字符是否是图形字符
double fabs(double x) 返回双精度参数x的绝对值
long labs(long n) 返回长整型参数n的绝对值
double exp(double x) 返回指数函数ex的值
参考资料来源:百度百科-C语言函数
参考资料来源:百度百科-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函数的调用过程。
首先断点在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
首先压入参数1和2:
002C141E 6A 02 push 2 002C1420 6A 01 push 1
通过观察ESP可以看到参数从右到左依次入栈,ESP往低内存方向移动8字节:
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函数应该这样写:scanf("%d,%d",a,b);但这样写的话,你输入两个数字之间必须输入一个逗号。
建议写成scanf("%d%d",a,b); 这样的话,两个数字之间输入空格就可以了
修改后的代码如下:
#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需要知道参数a,b的地址。a表示的就是a的地址,同理b也是
补充:lz的追问意思是不是我为什么把sum函数的代码改成return 0?
如果是这个意思,那我回答你:return表示从被调函数返回到主调函数继续执行,返回时可附带一个返回值,由return后面的参数指定。如果函数执行不需要返回计算结果,也经常需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码,-1代表异常,0代表正常)。
因为你需要输出的结果已经在函数里打印出来了。其实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函数里输出,需要函数返回值来给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; ---》只有一个字节的空间,不论怎么输入都会内存越界,最好改用char数组
char num;---》只有一个字节的空间,不论怎么输入都会内存越界,最好改用char数组