自己学习过程的一些小总结:
文章目录
<string.h>头文件
memset函数
头文件: #include <string.h>
函数原型:void* menset(void *s, int c, unsigned long n)
作用:将某一块内存中(一般是新申请的数组/结构体)的内容进行指定值的初始化。
参数:将指针变量s指向的那块内存的前n个字节的内存单元用一个整型c填充。
注意:void的字面意思是“无类型”,void* 则为“无类型指针”,void *可以指向任何类型的数据,任何类型的指针都可以直接赋值给它,无需进行强制类型转换。因此,该函数的第一个参数可以直接传参。
memcpy函数
头文件: #include <string.h>
函数原型:void *memcpy(void *str1, const void *str2, size_t n)
作用:从存储区 str2 复制 n 个字节到存储区 str1
参数:str1 — 指向用于存储复制内容的目标数组,类型强制转换为 void指针。(destination)
str2 — 指向要复制的数据源(source),类型强制转换为 void 指针。
n — 要被复制的字节数。
返回值:该函数返回一个指向目标存储区 str1 的指针
bzero函数
头文件: #include <string.h>
函数原型:void bzero(void *s, int n);
作用:将某内存块的前n个字节清零
参数:参照menset函数,bzero函数无返回值,而memset函数返回一个 “无类型”指针。
strcpy函数
头文件: #include <string.h>
函数原型:char *strcpy(char *dest, const char *src)
作用:把 src 所指向的字符串复制到 dest(注意dest的数组要足够大,避免造成溢出情况)
参数:dest – 指向用于存储复制内容的目标数组。
src – 要复制的字符串。
返回值:该函数返回一个指向最终的目标字符串 dest 的指针
注意事项:↓
图片所展示是我做面试题所遇到的一个问题,因为str1[10]字符数组中全是字符‘a’,但将其作为strcpy函数的传参,运行中会发生错误,即复制过程系统并不知道何时停止。
因此,值得注意的是:在实际应用中,我们不仅要考虑
1.目标数组是否足够大,避免溢出
2. 源指针的字符数组后面是否带有‘\0’,复制的停止条件是遇到’\0’
strlen函数
头文件: #include <string.h>
函数原型:unsigned int strlen (char *s)
作用:求字符串的长度(不包括字符串的结束符‘\0’)。判断依据,从字符串的开头位置往后计数,直到遇到‘\0’。(当某自定义字符数组里面没有\0,返回值不确定)
参数:计算指针s所指向的字符数组的长度,返回无符号整型length值
区分:sizeof()是关键字,不是函数,而且计算字符串长度值不会忽略‘\0’。
strcat函数
头文件: #include <string.h>
函数原型:char *strcat(char *dest, const char *src)
作用:把 src 所指向的字符串追加到 dest 所指向的字符串的结尾
(‘dest’ = “dest + src”)
参数: dest — 指向目标数组,该数组本身存有dest指向的字符串,且足够容纳追加后的字符串。
src — 指向要追加的字符串,该字符串不会覆盖目标字符串。
返回值:该函数返回一个指向最终的目标字符串 dest 的指针。
strstr函数
头文件: #include <string.h>
函数原型:char *strstr(char *str1, const char *str2);
作用:用于判断str2字符串是否是str1字符串的子集
参数: str1: 被查找目标
str2: 要查找对象
返回值:1)找到所匹配的字符串,则该函数返回第一次匹配的字符串的地址;
2)如果未找到所搜索的字符串,则返回NULL。
strchr函数
头文件: #include<stdio.h>
函数原型:char *strchr(const char *str, int c)
作用:用于查找str指针所指向的字符串中的一个字符c,并返回该字符在字符串中第一次出现的位置
参数:str :要查找的字符串
c:要查找的字符(字符的储存形式实质上是整型)
返回值:如果在字符串 str 中找到字符 c,则函数返回指向该字符的指针
如果未找到该字符则返回 NULL
strcmp函数
头文件: #include<stdio.h>
函数原型:int strcmp(const char *str1, const char *str2)
作用:把 str1 所指向的字符串和 str2 所指向的字符串进行比较(按 ASCII 值大小相比较)。比较结束标志:直到出现不同的字符或遇 ‘\0 ’为止
参数:str1:要进行比较的第一个字符串
str2:要进行比较的第二个字符串
返回值:如果返回值< 0,则表示 str1 <str2。
如果返回值 == 0,则表示 str1 == str2
如果返回值> 0,则表示 str1 > str2。
strncmp函数
头文件: #include<stdio.h>
函数原型:int strncmp(const char *str1, const char *str2, size_t n)
作用:把 str1 和 str2 进行比较,最多比较前 n 个字节
参数:str1 – 要进行比较的第一个字符串。
str2 – 要进行比较的第二个字符串。
n – 要比较的最大字符数
返回值:如果返回值< 0,则表示 str1 <str2。
如果返回值 == 0,则表示 str1 == str2
如果返回值> 0,则表示 str1 > str2。
<stdio.h>头文件
sprintf函数
头文件: #include<stdio.h>
函数原型:int sprintf( char *buffer, const char *format [, argument,…] );
作用:把一个字符串放在一个已知的字符数组里去,可以让其他数据类型转换成字符串类型
参数:
- char *buffer
接收字符串的字符数组。其大小必须要大于所接收的字符串的大小,否则的话会有空间不够从而导致内存溢出的风险。(这里比较大小时还要考虑到字符串最后的 ‘\0’) - const char *format
要传的字符串(定义了一个指向字符常量的指针,也就是说,不可以通过这个指针去改变指针所指向的地址的内容) - 剩下参数
对第二个参数format的补充
返回值:函数如果调用成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。
int i;
int len = 100;
float size = 13.14;
char arry[30] = {0}; //注意:ASCII码中0跟‘\0’是一样的
i = sprintf(arry,"len = %d, size = %.2f", len, size);
printf("%s\n", arry);
perror函数
头文件: #include<stdio.h>
函数原型:void perror(const char *str)
作用:把一个描述性错误消息输出到标准错误 stderr。出错后首先会输出字符串 str,再自动追加一个冒号,然后是一个空格 + 错误信息
出错运行结果:
rename函数
头文件: #include<stdio.h>
函数原型:int rename(const char *old_filename, const char *new_filename)
作用:把 old_filename 所指向的文件名改为 new_filename(必要时记得加路径)
参数:old_filename – 这是 C 字符串,包含了要被重命名/移动的文件名称。
new_filename – 这是 C 字符串,包含了文件的新名称
返回值:如果成功,则返回零。
如果错误,则返回 -1,并设置 errno。
remove函数
头文件: #include<stdio.h>
函数原型:int remove(const char *filename)
作用:删除给定的文件名 filename(必要时记得加路径),以便它不再被访问
参数:filename – 这是 C 字符串,包含了要被删除的文件名
返回值:如果成功,则返回零。
如果错误,则返回 -1,并设置 errno。
scanf函数、gechar函数、gets函数(标准终端输入)
函数 | scanf函数 | getchar函数 | gets函数 |
函数原型 | int scanf(const char *format, …) | int getchar(void) | char *gets(char *str) |
参数 | format – 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符 | 无参 | str – 这是指向一个字符数组的指针,该数组存储了 C 字符串 |
返回值 | 如果成功,该函数返回成功匹配和赋值的个数; 如果到达文件末尾或发生读错误,则返回 EOF | 该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF | 如果成功,该函数返回 str地址。 如果发生错误或者到达文件末尾时还未读取任何字符,则返回 NULL。 |
区别 | 以 space(空格) enter(回车) tab 作为结束, 且不接收 space, 回车符会残留在缓存区(可能会影响后续的数据读取) | 当用户键入回车之后,getchar才开始从stdin流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCII码(回车字符也会从缓冲区中读出),如出错返回-1 | 以 enter 作为结束, 接收 space(空格), 替换回车符为 ‘\0’(相当于给字符串加结束符), 不会保存回车符在缓存区 |
fscanf函数、fprintf函数(文件输入输出)
函数名 | fscanf函数 | fprintf函数 |
函数原型 | int fscanf(FILE *stream, const char *format, …) | int fprintf(FILE *stream, const char *format, …) |
参数 | stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流 format – 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符 | 与fscanf函数一样 |
返回值 | 如果成功,该函数返回成功匹配和赋值的个数。 如果到达文件末尾或发生读错误,则返回 EOF | 如果成功,则返回写入的字符总数,否则返回一个负数。 |
作用 | 只能从文本文件中按格式输入。 fscanf函数和scanf函数相似,只是输入的对象是磁盘上文本文件的数据 fscanf(stdin,“%d%d”,&a,&b); 等价于: scanf(“%d%d”,&a,&b); 因为文件名stdin就是代表终端键盘 | fprintf函数和printf函数相似,只是输出的内容将按格式存放在磁盘的文本文件中 语句: fprintf(stdout,“%d%d”,x,y); 等价于: printf(“%d%d”,x,y);因为文件名stdout就是代表终端屏幕 |
fputs函数、fgets函数(文件读写)
函数名 | fgets函数 | fputs函数 |
函数原型 | char *fgets(char *str, int n, FILE *stream) | int fputs(const char *str, FILE *stream) |
参数 | str – 这是指向一个字符数组的指针,该数组存储了要读取的字符串。 n – 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。 stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。 | str – 这是一个数组,包含了要写入的以空字符终止的字符序列 stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流 |
返回值 | 如果成功,该函数返回相同的 str 参数。 如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。 | 该函数返回一个非负值,如果发生错误则返回 EOF |
作用区别 | 该函数从文件描述符fd指定的文件获得n个字符存入从str开始的n个内存单元中。由于其形参中规定了最大接受字符数,故不会发生像scanf函数那样的缓存溢出的问题(这时候j计算机是从指定文件读出数据) | 把字符串写入到指定的流 stream 中,但不包括空字符(计算机将数据写入指定的文件) |
总览示意图:
<stdlib.h>头文件
atoi函数
头文件: #include<stdlib.h>
函数原型:int atoi(const char *str)
作用:把参数 str 所指向的字符串转换为一个整数(类型为 int 型)
参数:str – 要转换为整数的字符串(字符串中只能带数字字符,否则转换失败,返回0)
返回值:该函数返回转换后的长整数
如果没有执行有效的转换,则返回0