目录
在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了⼀系列库函数,接下来我们就学习⼀下这些函数。
字符分类函数
C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。
这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h
这里就介绍几个函数吧,用法都是一样的
islower函数
是小写字母将返回大于0的数字
不是小写字母返回0
isupper函数
是大写字母返回大于0的数字
不是大写字母返回0
字符转换函数
int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写
小写转大写就是-32
大写转小写就是+32
字符串小写转大写
下面这代码我们可以看到利用islower函数判断是不是小写,是的话利用toupper转大写
当然+32也是可以的
字符串大写转小写
下面这代码我们可以看到利用isupper函数判断是不是小写,是的话利用tolower转小写
当然-32也是可以的
strlen函数的使用和模拟实现
需要的头文件:#include<string.h>
https://cplusplus.com/reference/cstring/strlen/?kw=strlen
strlen是计算字符串长度的
strlen模拟实现计数器⽅式
利用一个变量来计数
//计数器
int mn_strlen(char* x)
{
//计数器
int num = 0;
while (*x != '\0')
{
num++;
x++;
}
return num;
}
int main()
{
char arr[] = "asdfsffgdg";
int r = mn_strlen(arr);
printf("%d\n", r);
return 0;
}
strlen模拟实现不能创建临时变量计数器
使用递归方法实现strlen函数
//不能创建临时变量计数器
int mn_strlen(char* x)
{
if (*x == '\0')
{
return 0;
}
else
{
//每次递归,地址往后走,遇到\0回归
return 1 + mn_strlen(x + 1);
}
}
int main()
{
char arr[] = "asdfsffgdg";
int r = strlen(arr);
printf("%d\n", r);
return 0;
}
strlen指针-指针的⽅式
int mn_strlen(char* x)
{
int* p = x;
//循环往后到\0
while (*p != '\0')
{
p++;
}
//通过后面的地址减去首地址就可以拿到有多少个了
return p - x;;
}
int main()
{
char arr[] = "asdfsffgdg";
int r = strlen(arr);
printf("%d\n", r);
return 0;
}
stcpy的使用和模拟实现
需要的头文件:#include<string.h>
https://legacy.cplusplus.com/reference/cstring/stcpy/
这个函数是复制字符串
源字符串必须以 '\0' 结束。
会将源字符串中的 '\0' 拷⻉到⽬标空间。
⽬标空间必须⾜够⼤,以确保能存放源字符串。
⽬标空间必须可修改。
stcpy模拟实现
char* mn_stcpy(char* x, char* y)
{
while (*y != '\0')
{
*x = *y;
x++;
y++;
}
}
int main()
{
char arr[] = "asfsdfs";
char r[99] = { 0 };
mn_stcpy(r, arr);
printf("%s\n", r);
}
strcat的使用和模拟实现
需要的头文件:#include<string.h>
https://legacy.cplusplus.com/reference/cstring/strcat/
strcat函数就是在字符串后面追加字符串
strcat模拟实现
就是先把r往后走到\0停下来,然后arr赋值到r后面
char* mn_strcat(char* r, char* arr)
{
//r走到\0的位置
while (*r != '\0')
{
r++;
}
//把arr的字符串赋值到r字符串的后面
while (*arr != '\0')
{
*r = *arr;
r++;
arr++;
}
}
int main()
{
char arr[] = "asfsdfs";
char r[99] = "xxxx ";
mn_strcat(r, arr);
printf("%s\n", r);
}
strcmp的使用和模拟实现
需要的头文件:#include<string.h>
https://legacy.cplusplus.com/reference/cstring/strcmp/
strcmp是比较字符串的,当然是一个一个字符比较的
小于就返回小于0的数字
大于就返回大于0的数字
等于返回0
下面这代码我们可以看到s比z小返回-1
比较是通过ASCII码来比较的
stcmp模拟实现
int mn_strcmp(char* x, char* y)
{
//等于就往后找
while (*x == *y)
{
//x找到\0就说明这2个数组都是一样的
if (*x == '\0')
{
return 0;
}
x++;
y++;
}
//小于返回-1
if (*x < *y)
{
return -1;
}
//大于返回1
else
{
return 1;
}
}
int main()
{
char arr[] = "asfsdfs";
char arr2[] = "asfzdfs";
int r = mn_strcmp(arr, arr2);
printf("%d\n", r);
}
strncpy函数
需要的头文件:#include<string.h>
https://legacy.cplusplus.com/reference/cstring/strncpy/
strcpy是复制整个字符串,str n cpy这个数可以自己指定要复制多少个字符
strncpy模拟实现
char* mn_strncpy(char* r, char* arr, size_t sz)
{
while (sz--)
{
*r = *arr;
r++;
arr++;
}
}
int main()
{
char arr[] = "asfsdfs";
char r[99] = {0};
mn_strncpy(r, arr,3);
printf("%s\n", r);
}
strncat函数
需要的头文件:#include<string.h>
https://legacy.cplusplus.com/reference/cstring/strncat/
这个函数可以自己指定要追加多少个字符
strncat模拟实现
char* mn_strncat(char* r, char* arr, size_t sz)
{
while (*r != '\0')
{
r++;
}
while (sz--)
{
*r = *arr;
r++;
arr++;
}
}
int main()
{
char arr[] = "asfsdfs";
char r[99] = "xxxx ";
mn_strncat(r, arr, 3);
printf("%s\n", r);
}
strncmp函数
需要的头文件:#include<string.h>
https://legacy.cplusplus.com/reference/cstring/strncmp/
这个函数可以自己指定要比较多少个字符
strncmp模拟实现
int mn_strncmp(char* x, char* y, size_t sz)
{
//循环判断x等于y就往后走,不等于就跳出
while (*x == *y)
{
//sz等于0了,就说明这些字符是一样的
if (sz == 0)
{
return 0;
}
x++;
y++;
sz--;
}
//判断大于,小于
if (*x < *y)
{
return -1;
}
else
{
return 1;
}
}
int main()
{
char arr[] = "asfsdfs";
char arr1[] = "asfsdfs";
int r = mn_strncmp(arr, arr1, 3);
printf("%d\n", r);
}
strtok函数
https://legacy.cplusplus.com/reference/cstring/strtok/
char * strtok ( char * str, const char * sep);
strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容
并且可修改。)
• strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串
中的位置。
• strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标
记。
• 如果字符串中不存在更多的标记,则返回 NULL 指针。
strtok函数的第⼀个参数不为 NULL ,函数将找到p中第⼀个标记,strtok函数将保存它在字符串
中的位置。
strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标
strerror函数
https://legacy.cplusplus.com/reference/cstring/strerror/
strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明
的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动
的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应
的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是
有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
strstr函数的使用和模拟实现
需要的头文件:#include<string.h>
https://legacy.cplusplus.com/reference/cstring/strstr/
这是一个字符串匹配
int main()
{
char arr[] = "asdfddds";
//匹配arr里有没有这个字符串
char* p = "fdd";
//没有就返回NULL,有就返回arr的qwe和后面的字符串
char*r = strstr(arr, p);
if (r == NULL)
{
printf("不存在");
}
else
{
printf("%s\n", r);
}
}
strstr函数的模拟实现
main函数
模拟的strstr
我们可以创建是S1和S2这2个指针进行比较
创建sz指针把arr的地址给sz,让sz找\0这样的话,
sz赋值给s1,p赋值给s2
s1有2个相同第3个不同这样的话可以返回回来sz++继续找下一个
s2也是一样第3个不同可以返回回来
char* mn_strstr(char* arr, char* p)
{
char* s1 = NULL;
char* s2 = NULL;
char* sz = arr;
while (*sz != '\0')
{
//赋值给s1和s2去匹配,这样的话s1找不到的话sz赋值回来继续找s2也一样
s1 = sz;
s2 = p;
while (*s1 == *s2)
{
s1++;
s2++;
//s2的走到\0就说明找到了
if (s2 == '\0')
{
//返回sz的地址
return sz;
}
}
sz++;
}
//找不到返回NULL
return NULL;
}
标签:字符,arr,函数,sz,int,C语言,char,++
From: https://blog.csdn.net/2401_86723488/article/details/142471140