系统调用函数 - system
sizeof关键字
time
srand
rand
示例:
#include <stdio.h> #include <time.h> #include <stdlib.h> int main() { time_t tm = time(NULL);//得到系统时间 srand((unsigned int)tm);//随机种子只需要设置一次即可 int r = rand(); printf("r = %d ", r); return 0; }
字符串处理函数
1. gets()
- 成功:读入的字符串
- 失败:NULL
- gets(str)允许输入的字符串含有空格
- scanf("%s",str)不允许含有空格
注意:由于 scanf() 和 gets() 无法知道字符串s大小,必须遇到换行符或读到文件结尾为止才接收输入,因此容易导致字符数组越界(缓冲区溢出)的情况。
示例:
2. puts()
功能:从标准设备上输出一个字符串,在输出完成后自动输出一个' ' 换行。
参数:
s:字符指针
返回值:
- 成功:非负数
- 失败:-1
示例:
3. fget()
功能:接收固定大小的字符串,从stream指定的文件内读入字符,保存到s所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size - 1个字符为止,最后会自动加上字符 ' ' 作为字符串结束。安全
参数:
- s:字符指针
- size:指定最大读取字符串的长度(size - 1)
- stream:流,如果读键盘输入的字符串,固定写为stdin
返回值:
- 成功:成功读取的字符串
- 读到文件尾或出错: NULL
注意:
- 如果接收少于大小,会将 加入到字符串中
- 如果接收大于等于大小,不会将 加入到字符串中,始终会将 加入到字符串中
fgets() 在读取一个用户通过键盘输入的字符串的时候,同时把用户输入的回车也做为字符串的一部分。通过 scanf 和 gets 输入一个字符串的时候,不包含结尾的“ ”,但通过 fgets 结尾多了“ ”。fgets()函数是安全的,不存在缓冲区溢出的问题。
示例:
4. fputs()
功能:将str所指定的字符串写入到stream指定的文件中, 字符串结束符 ' ' 不写入文件。
参数:
- s:字符指针
- stream:流,如果把字符串输出到屏幕,固定写为stdout
返回值:
- 成功:0
- 失败:-1
fputs()是puts()的文件操作版本,但 fputs() 不会自动输出一个' '。
示例:
5. strlen() - 计算字符串长度
功能:计算目标字符串的长度,不包含字符串结束符‘ ’
参数:s:字符指针
返回值:字符串s的长度,size_t 为 unsigned int 类型
示例:
6. strcpy() - 拷贝
功能:把src所指向的字符串复制到dest所指向的空间中,' '也会拷贝过去
参数:
- dest:目标字符串
- src:源字符串
返回值:
- 成功:返回目标字符串的首地址
- 失败:NULL
注意:如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况。
示例:
7. strncpy() - 有限拷贝
功能:把src指向字符串的前n个字符复制到dest所指向的空间中,是否拷贝结束符看指定的长度是否包含' '。
参数:
- dest:目标字符串首地址
- src:源字符串首地址
- n:指定需要拷贝字符串长度
返回值:
- 成功:返回dest字符串的首地址
- 失败:NULL
注意:有限拷贝不会将 拷贝到目标字符串中
示例:
8. strcat() - 追加
功能:将src字符串连接到dest的尾部,‘ ’也会追加过去
参数:
- dest:目的字符串首地址
- src:源字符首地址
返回值:
- 成功:返回dest字符串的首地址
- 失败:NULL
示例:
9. strncat() - 有限追加
功能:将src字符串前n个字符连接到dest的尾部,‘ ’也会追加过去
参数:
- dest:目的字符串首地址
- src:源字符首地址
- n:指定需要追加字符串个数
返回值:
- 成功:返回dest字符串的首地址
- 失败:NULL
示例:
10. strcmp() - 比较
功能:比较 s1 和 s2 的大小,比较的是字符ASCII码大小。比较 之前的所有有效字符
参数:
- s1:字符串1首地址
- s2:字符串2首地址
返回值:
- 相等:0
- 大于:>0,在不同操作系统中 strcmp 结果会不同,有的返回ASCII 码差值
- 小于:<0
示例:
11. strncmp() - 有限比较
功能:比较 s1 和 s2 前n个字符的大小,比较的是字符ASCII码大小。
参数:
- s1:字符串1首地址
- s2:字符串2首地址
- n:指定比较字符串的数量
返回值:
- 相等:0
- 大于:> 0
- 小于:< 0
示例:
12. printf()
功能:格式化输出,直到出现字符串结束符 ' ' 为止。
参数:
- str:字符指针
- format:字符串格式
返回值:
- 成功:实际格式化的字符个数
- 失败: - 1
示例:
13. scanf()
功能:从str指定的字符串读取数据,并根据参数format字符串来转换并格式化数据。
参数:
- str:指定的字符串首地址
- format:字符串格式
返回值:
- 成功:参数数目,成功转换的值的个数
- 失败: - 1
示例:
14. sprintf() - 字符串格式化
功能:根据参数format字符串来转换并格式化数据,然后将结果输出到str指定的空间中,直到出现字符串结束符 ' ' 为止。
参数:
- str:字符指针
- format:字符串格式,用法和printf()一样
返回值:
- 成功:实际格式化的字符个数
- 失败: - 1
示例:
15. sscanf()
功能:从str指定的字符串读取数据,并根据参数format字符串来转换并格式化数据。
参数:
- str:指定的字符串首地址
- format:字符串格式,用法和scanf()一样
返回值:
- 成功:参数数目,成功转换的值的个数
- 失败: - 1
示例:
16. strchr()
功能:在字符串s中查找字母c出现的位置
参数:
- s:字符串首地址
- c:匹配字母(字符)
返回值:
- 成功:返回第一次出现的c地址
- 失败:NULL
示例:
17. strstr()
功能:在字符串haystack中查找字符串needle出现的位置
参数:
- haystack:源字符串首地址
- needle:匹配字符串首地址
返回值:
- 成功:返回第一次出现的needle地址
- 失败:NULL
示例:
18. strtok() - 字符串切割
功能:来将字符串分割成一个个片段。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时, 则会将该字符改为 字符,当连续出现多个时只替换第一个为 。
参数:
- str:指向欲分割的字符串
- delim:为分割字符串中包含的所有字符
返回值:
- 成功:分割后字符串首地址
- 失败:NULL
在第一次调用时:strtok() 必需给予参数s字符串
往后的调用则将参数s设置成NULL,每次调用成功则返回指向被分割出片段的指针
示例:
19. atoi() - 字符串转换
功能:atoi()会扫描nptr字符串,跳过前面的空格字符,直到遇到数字或正负号才开始做转换,而遇到非数字或字符串结束符(' ')才结束转换,并将结果返回返回值。
参数:nptr:待转换的字符串
返回值:成功转换后整数
类似的函数有:
- atof():把一个小数形式的字符串转化为一个浮点数。
- atol():将一个字符串转化为long类型
示例:
内存操作函数
1、memset
功能:将s的内存区域的前n个字节以参数c填入
参数:
- s:需要操作内存s的首地址
- c:填充的字符,c虽然参数为int,但必须是unsigned char , 范围为0~255
- n:指定需要设置的大小
返回值:s的首地址
示例:
2、memcpy
功能:拷贝src所指的内存内容的前n个字节到dest所值的内存地址上。
参数:
- dest:目的内存首地址
- src:源内存首地址,注意:dest和src所指的内存空间不可重叠
- n:需要拷贝的字节数
返回值:dest的首地址
示例:
strcpy 与 memcpy 的区别:
- 函数参数不同
- strcpy 只能拷贝字符串,memcpy 可以拷贝一块内存
- 拷贝结束标志不同。strcpy 是以' '为结尾,memcpy 是以 n 的个数为结尾。这两个都是不安全的
3、memmove
功能:拷贝src所指的内存内容的前n个字节到dest所值的内存地址上。
参数:
- dest:目的内存首地址
- src:源内存首地址,注意:dest和src所指的内存空间不可重叠
- n:需要拷贝的字节数
返回值:dest的首地址
memmove()功能用法和memcpy()一样,区别在于:dest和src所指的内存空间重叠时,memmove()仍然能处理,不过执行效率比memcpy()低些。
memmove()拷贝重叠内存地址不会出现问题,但是效率比较低。如果拷贝源和拷贝目标没有重叠,两个函数效率一样
4、memcmp
功能:比较s1和s2所指向内存区域的前n个字节
参数:
- s1:内存首地址1
- s2:内存首地址2
- n:需比较的前n个字节
返回值:
- 相等:=0
- 大于:>0
- 小于:<0
示例:
堆区内存分配和释放
malloc
功能:在内存的动态存储区(堆区)中分配一块长度为size字节的连续区域,用来存放类型说明符指定的类型。分配的内存空间内容不确定,一般使用memset初始化。
参数:
- size:需要分配内存大小(单位:字节)
返回值:
- 成功:分配空间的起始地址
- 失败:NULL
示例:
free
功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,指向被释放区域的首地址。对同一内存空间多次释放会出错。
参数:
- ptr:需要释放空间的首地址,被释放区应是由malloc函数所分配的区域。
返回值:无