这一篇博客跟大家来谈一谈初识c语言的几个函数。
main函数
所有的C程序必须定义一个称之为main的外部函数,main函数是程序的入口,也就是当程序启动时所执行的第一个函数,当这个函数返回时,程序也将终止,并且这个函数的返回值被看成是程序成功或失败的标志,如果在到达main函数体的末尾时没有遇到返回语句 ,那就是遇到右括号就返回。
C的设计原则是把函数作为程序的构成模块。main()函数称之为主函数,一个C程序总是从main()函数开始执行的
main函数只有两种标准形式:
int main(void ) { }
int main(int argc ,char *argv[ ]) { }
char*argv[ ]是指针数组,[]的优先级很高,argv[]是数组,里面存放的类型是char*,每个main函数的参数都是字符串 char * argc 是main函数参数(外部命令参数)的个数,argv[] 存放各参数的内容。
如何理解:
在linux下编写一个hello.c文件如下:
此时的main函数是当前shell的一个子进程,而shell则是main函数的一个父进程。
gcc hello.c 编译好hello.c
在shell命令行输入.a/.out 执行该c程序
就可以看到main函数的参数是1 参数的内容是.a/.out
Linux下shell脚本给Main函数传递参数时候,一个空格代表一个参数的结束。
main函数返回类型默认是int,其实,如果没有返回值, 编译器会给你加上。
坚持使用标准的意义在于:当你把程序从一个编译器移到另一个编译器时,照样能正常运行。
返回值:
由于是 int main( ..) 那么当时 应当返回 int 但是 return 2.3 ;也能运行正确,这是因为编译器自动转换2.3为int,截断后为return 2;
如果写为 return “abc”;那么会报错, error C2440: “return”: 无法从“const char [4]”转换为“int”
返回值的意义:
return返回的数值由程序的作者自定。返回不同的值可以代表不同的含义,一般是代表出错的原因。传统上返回0代表程序正常结束(其它返回值代表什么含义,需要程序的开发者向程序的用户说明)。返回-1代表程序运行没有得到想要的结果。
接下来认识几个
1 Strcmp函数
在linux下用man 3 strcmp查看这个函数的用法:
Strcmp(const char *s1,const char *s2)
比较s1和s2的字符串大小 如果s1比s2大的话,返回一个大于零的数,相等的话,返回0,如果s1比s2小的话,就返回一个小于0的数。
strcmp函数调用实例:
我们可以自己来写一个比较字符串的函数:
调用自己写的函数 比较两个数125和124的大小:
结果:
2 strlen函数
在ubuntu系统下查看strlen函数的用法
计算字符串s的长度 单位是字节 不包括字符串的结尾 \0
我们可以编辑一个自己的统计字符串字节的函数如下:
#include<stdio.h>
int my_strlen(char *p)
{
int i = 0;
//p[i]不为0的时候,就执行i++统计
while(p[i])
{
i++;
}
return i;
}
int main(void)
{
char str[] = "hello";
printf("strlen=%d\n",my_strlen(str));
}
程序执行结果为 5 分别是 h 、e, l, l, o。
memset函数
memset调用实例:
将字符数组写0
将字符数组里面的字符替换为字符0
我们可以自己写一个memset函数来实现其功能如下:
将字符数组里面的字符全部替换成了b
strcpy函数
strcpy 是依据 /0 作为结束判断的,/0会被拷贝。如果存放的空间不够,则会引起 buffer overflow。
strcpy调用实例
自己写一个strcpy的函数如下:
memcpy函数
(1)从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
(2)如果目标数组dest本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。
memcpy调用实例
strcpy和memcpy的区别
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符”\0”才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。
请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数。
被调函数主体:
主函数主体:
运行结果:
3二进制存的里面有两个1
strcat函数
(1) 函数原型
char *strcat(char *dest, const char *src);
(2) 函数说明
dest 为目的字符串指针,src 为源字符串指针。strcat() 会将参数 src 字符串复制到参数 dest 所指的字符串尾部;dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL。
注意:dest 与 src 所指的内存空间不能重叠,且 dest 要有足够的空间来容纳要复制的字符串。
(3) 返回值
返回dest 字符串起始地址。
strncat
原型:extern char *strncat(char *dest,char *src,int n);
库文件:#include
网络字节的转换函数
htonl()--"Host to Network Long"
ntohl()--"Network to Host Long"
htons()--"Host to Network Short"
ntohs()--"Network to Host Short"