字符函数&内存函数使用

0.NULL – 空指针

NUL,Null – ‘\0’

1.strtok函数

样例

#include <stdio.h>
#include <string.h>
int main()
{
char str[100];
scanf("%s",str);
char* p = ".,";
char* ret = NULL;
for(ret = strtok(str,p);ret != NULL;ret = strtok(NULL,p))
printf("%s\n",ret);
return 0;
}

1.1 函数的作用

​ 将字符数组以特定字符分隔开,字符可以是任意几个特定的字符

​ 1.2 函数参数

char* strtok(char * str,const char * sep)

​ 1.3 如果找到特定字符,会直接将原字符数组的该位置字符改为 ‘/0’

​ 1.4 传入的str不为空指针NULL,strtok将找到str的第一个标记,并保存他在字符串中的位置

​ 1.5 传入的str为空指针NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记

​ 1.6 如果传入的str中有sep函数中两个至多个字符连续存在的情况,也会分隔,而不是空出一个位置

2.strerror函数

样例

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
// errno是什么和strerror怎么用
char* str = strerror(errno);
printf("%s\n",str);

//strerror的应用
FILE* pf = fopen("test.c","r");//以可读方式打开test.c文件
if(pf == NULL)
{
printf("%s\n",strerror(errno));//报告错误信息
}
else printf("%s\n",pf);
return 0;
}

2.1 函数作用

​ 返回错误码所对应的信息,即将错误码转换成一个字符串并返回,告诉程序员报错信息

2.2 errno

​ 一个全局变量,即错误码

​ 当程序执行过程中出现了错误,就会把对应的错误码赋值到errno中

2.3 对应信息

​ 错误码 对应信息

​ 0 – NO ERROR 无错误

​ 1 – Operation not permitted

​ 2 – No such file or directory

​ …

3. 字符分类函数

样例

#include <stdio.h>
int main()
{
char ch = 'm';
int st = islower(ch);
if(st) printf("是小写字母");
else printf("不是小写字母");
return 0;
}

3.1

函数 如果他的参数符合下列条件就返回真
iscntrl 任何控制字符
isspace 空白字符:空格’ ‘,换页’\f’,换行’\n’,回车‘\r’,制表符’t’或者垂直制表符’\v’
isdigit 十进制数字0-9
isxdigit 十六进制数字,包括所有十进制数字,小写字母af大写字母AF
islower 小写字母a-z
isupper 大写字母AZ
isalpha 字母a
z或AZ
isalnum 字母或者数字,a
z,AZ,09
ispunct 标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph 任何图形字符
isprint 任何可打印字符,包括图形字符和空白字符

3.2 字符转换函数

样例

#include <stdio.h>
int main()
{
char ch;
scanf("%c",&ch);
ch = toupper(ch);
putchar(ch);
return 0;
}

​ tolower函数:转为小写字母

​ toupper函数:转为大写字母

4.strlen函数的返回值为size_t,为无符号数

5.strcmp(arr1,arr2)比较字符串函数

6.strncmp函数

样例

#include <stdio.h>
#include <string.h>
int main()
{
const char* string1 = "abcdef";
const char* string2 = "abcefg";
int ret = strncmp(string1,string2,3);
printf("%d",ret);
return 0;
}

6.1 作用

指定前n个长度的字符串比较

6.2 函数参数

int strncmp(const char* string1,const char* string 2, size_t count)

7.strstr函数

样例

#include <stdio.h>
#include <string.h>
int main()
{
char* str1 = "abcdef";
char* str2 = "def";
char* ret = strstr(str1,str2);
if(ret == NULL) printf("未找到");
else printf("找到了,接下来的字符串是%s",ret);
return 0;
}

7.1 作用

查找指定字符串,如果找到则返回首字符的地址,如果没找到则返回NULL

内存操作函数(同样需要string.h库函数)

样例

#include <stdio.h>
#include <string.h>
int main()
{
int arr1[5] = {1,2,3,4,5};
int arr2[5] = {0};
memcpy(arr2,arr1,sizeof(arr2));
int i = 0;
for(i = 0;i < 5;++i)
{
printf("%d\n",arr2[i]);
}
return 0;
}

1. memcpy内存拷贝函数

​ 1.1 作用

​ 处理不重叠的数组拷贝

2.memmove内存拷贝函数

​ 2.1作用

​ 处理重叠的数组拷贝

3.两者区别的具体解释

​ 如果从低地址开始拷贝,那么源数据在使用前会被覆盖。除了这种情况,其他情况下都可以保证memcpy拷贝正确。

​ memmove是在memcpy的基础上对所有可能的情况都做了处理;

​ 简单的说就是在内存重叠且源数据会被覆盖的情况下选择从高地址开始拷贝,而其他情况下选择从低地址开始拷贝。