-------
-------------书似青山常乱叠
-----------------------灯如红豆最相思
愿
看此篇的你,一码当先,月薪过万!
目录
字符分类函数
字符转换函数
字符串库函数的使用与模拟
strlen的使用和模拟实现
模拟实现strlen库函数:
长度不受限制的字符串函数
strcpy的使用与模拟实现
模拟实现strcpy库函数:
strcat的使用和模拟实现
模拟实现strcat库函数:
strcmp的使用和模拟实现
模拟实现strcmp库函数:
长度受限制的字符串函数
strncpy函数的使用
strncat函数的使用
strncmp函数的使用
strstr函数的使用 编辑
strok函数的使用
判断一个字符属于什么类型
下面函数,如果它的参数符合条件就返回真值(>0),需要被#include
iscntrl:任何控制字符;
isspace:空白字符:
空格‘ ’,换页‘ \f ’,换行‘ \n ’,回车‘ \r ’,水平制表符' \t ',垂直制表符‘ \v ’;
isdigit:十进制数字0~9;
isdigit:十六进制数字,包括所有十进制数字,小写字母a~f大写字母A~F;
islower:小写字母a~z;
isupper:大写字母A~Z;
isalpha:字母或数字;
ispunct:标点符号;
isgraph:任何图形字符;
isprint:任何打印字符,包括图形字符和空白字符;
这些函数的使用方法十分类似,我们通过isupper来说明:
我们通过对sum的赋值来判断Hello World语句的输出
#include
#include
int main()
{
char sum = 0;
scanf_s("%c", &sum);
if (isupper(sum))
{
printf("Hello World!");
}
return 0;
}
如果sum赋值的是大写字母返回非0值,结果为真执行语句
如果sum赋值的是其他字符就返回0,结果为假语句不执行
1.tolower(char 字符):将大写字母转小写字母;
2.toupper(char 字符):将小写字母转大写字母;
#include
#include
int main()
{
int i = 0;
char arr[] = "Hello World!";
char sum;
while (arr[i]) //当遇到'\0'的时候循环停止
{
sum = arr[i];
if (isupper(sum)) //判断字符是否为大写字符
sum = tolower(sum); //将大写转换为小写
putchar(sum); //每次输出单个字符
i++;
}
return 0;
}
size_t strlen ( const char * str );
1.strlen常被我们用来统计字符数组的长度,它是以'\0'为结束标志的
2.strlen返回值是size_t是无符号的整形
3.strlen的使用需要包含#include
头文件
#include
#include
int main()
{
char arr1[] = "abc";
char arr2[] = { 'a','b','c' };
char arr3[] = { 'a','b','c','\0' };
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));
printf("%d\n", strlen(arr3));
return 0;
}
我们来看以上代码的输出结果:
1.因为字符串的形式会在末尾自动补上'\0',所以arr1的大小是3;
2.因为arr2没有'\0',strlen会直到找到'\0'才停止,所以输出随机值;
3.arr3由于补上了'\0',所以strlen找到'\0'停止计算,输出长度为3;
#include
size_t my_strlen(char* arr)
{
int count = 0;
while (*arr)
{
count++;
arr++;
}
return count;
}
int main()
{
char arr[] = "Hello World!";
size_t rs = my_strlen(arr);
printf("%zd", rs);
return 0;
}
也可以用递归的方法实现:
#include
int my_strlen(const char* arr)
{
if (*arr)
return 1 + my_strlen(arr + 1);
else
return 0;
}
int main()
{
char arr[] = "Hello World!";
size_t rs = my_strlen(arr);
printf("%zd", rs);
return 0;
}
size_t:无返回值的整形的判断:
我们来判断以下代码的打印结果是:大于还是小于
#include
#include
int main()
{
char arr1[] = "abc";
char arr2[] = "abcdef";
if (strlen(arr1) - strlen(arr2) > 0)
{
printf("大于\n");
}
else
{
printf("小于\n");
}
return 0;
}
我们发现它执行的是大于语句,那么arr1的大小真的大于arr2吗?非也。
因为strlen是size_t无符号的整型,
一个无符号的整型减去另一个无符号的整型结果依然还是无符号,
if里面的结果就为真。
我们只要给它强制类型转换一下就好啦!比如说转换成int型,这样就有符号了。
这一类的函数是不安全的,编译器会报警告,我们只要在第一位置加上以下代码就可以啦
#define _CRT_SECURE_NO_WARNINGS 1
char* strcpy(char * destination, const char * source );
目标字符串 源字符串
1.常被我们用来拷贝字符串
2.源字符串必须以'\0'结束
3.会将源字符串的'\0'拷贝到目标空间
4.目标空间要确保足够大,以确保能存放源字符串
5.目标空间必须是可修改值
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
char arr1[20] = { 0 };
char arr3[20] = "******************";
char arr2[] = "Hello World!";
strcpy(arr1, arr2);
strcpy(arr3, arr2);
printf("%s\n", arr1);
return 0;
}
通过以上我们可以看到,源字符串的'\0'被拷贝到目标字符串里
如果源字符串没有'\0',可能会将一些乱码拷贝给arr1
如果arr1的空间不够程序就会越界访问
目标空间必须是可修改的字符串,像以下的常量字符串是不可修改的,所以程序会崩掉
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
char* my_strcpy(char* dest, char* src)
{ //取了两个数组的首地址
char* ret = dest;
while (*src) //当*scr是'\0'时,循环结束
{
*dest++ = *src++;
//也可以这么写:*dest = *src;
//dest++;
//src++;
}
*dest = *src; //将'\0'拷贝到目标空间
return ret;
}
int main()
{
char arr1[20] = { 0 };
char arr2[] = "Hello World!";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
char * strcat ( char * destination, const char * source );
//目标字符串 备份字符串
具体操作就是将备份字符串拼接到目标字符串的末尾也就是'\0'的位置
1.常被我们用来追加字符串
2.源字符串必须以'\0'结束
3.目标字符串也得有'\0',否则没办法知道从哪里开始
4.目标空间必须足够大,能容纳下源字符串的内容
5.目标字符串必须可修改
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
char arr1[20] = "Hello ";
char arr2[] = "World!";
strcat(arr1, arr2);
printf("%s", arr1);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
char* my_strcat(char* destination, const char* source)
{
char* str = destination;
while (*destination)
{
destination++; //找到目标函数的末位置
}
while (*source)
{
*destination++ = *source++;
}
*destination = *source;
return str;
}
int main()
{
char arr1[20] = "Hello ";
char arr2[] = "World!";
my_strcat(arr1, arr2);
printf("%s", arr1);
return 0;
}
int strcmp ( const char * str1, const char * str2 );
1. 常用于比较字符串的大小
2.第一个字符串大于第二个字符串,则返回大于0的值
3.第一个字符串等于第二个字符串,则返回0
4.第一个字符串小于第二个字符串,则返回小于0的值
5.比较两个字符串对应位置上的字符ASCLL码值的大小来判断字符串的大小
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
char arr1[] = "abcdefgh";
char arr2[] = "accdez";
int rs = strcmp(arr1, arr2);
printf("%d", rs);
return 0;
}
通过返回结果我们可以看到arr1的大小是小于arr2的
而且字符串比较的不是长度而是对应位置上的大小ASCLL大小
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int strcmp(const char* str1, const char* str2)
{
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
if (*str1 > *str2)
{
return 1;
}
else
{
return -1;
}
}
int main()
{
char arr1[] = "abcdefgh";
char arr2[] = "accdez";
int rs = strcmp(arr1, arr2);
printf("%d", rs);
return 0;
}
char * strncpy ( char * destination, const char * source, size_t num );
//目标字符串 源字符串 从源字符串最大拷贝的个数
1.拷贝源字符串的num个字符到目标字符串的空间(拷贝函数)
2.如果源字符串的长度小于num,则会在拷贝完源字符串后在目标字符串后面补'\0'直到num个字符为止
3.可以选择拷贝的内容
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
char arr1[20] = "**************";
char arr2[] = "Hello World!";
strncpy(arr1, arr2+6, 6);
printf("%s\n", arr1);
return 0;
}
而且他只会根据num的大小来确定拷贝多少,不用特意追加'\0'
char * strncat ( char * destination, const char * source, size_t num );
1.将source指向字符串的前num个字符追加到目标字符串的末尾,并再追加一个'\0'(追加函数)
2.如果source指向字符串的长度小于num的时候,只会将字符串中到'\0'的内容追加到目标字符串的末尾
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
char arr1[20] = "hello ";
char arr2[] = "World!!!";
strncat(arr1,arr2,5);
printf("%s\n", arr1);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
char arr1[20] = "****\0**********";
char arr2[] = "Hello World!";
strncat(arr1,arr2,4);
printf("%s\n", arr1);
return 0;
}
我们可以看到追加过去的时候,再追加了一个'\0'
int strncmp ( const char * str1, const char * str2, size_t num );
//比较前几个字符
/*
1. 常用于比较字符串的大小
2.第一个字符串大于第二个字符串,则返回大于0的值
3.第一个字符串等于第二个字符串,则返回0
4.第一个字符串小于第二个字符串,则返回小于0的值
5.比较两个字符串对应位置上的字符ASCLL码值的大小来判断字符串的大小
*/
这样可以提高程序运行的效率
#define _CRT_SECURE_NO_WARNINGS 1 #include
#include int main() { char arr1[] = "abcdefg"; char arr2[] = "abcdzfg"; int rs = strncmp(arr1,arr2,4); printf("%d\n", rs); return 0; }
const char * strstr ( const char * str1, const char * str2 );
1.函数返回字符串str2在字符串str1中第一次出现的位置(判断字符串是否存在)
2.字符串的匹配不包括'\0','\0'作为结束标志
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
char arr1[] = "abcdefg";
char arr2[] = "abc";
char* ret = strstr(arr1,arr2);
if (ret != NULL)
printf("%s\n", ret);
else
printf("找不到!\n");
return 0;
}
char * strtok ( char * str, const char * delimiters );
//指向str字符串,定义分割符的集合
1.常被我们用来提取关键信息
2.比如说[email protected],如果被分隔符挡着我们很难提取关键信息,我们可以用strok函数找到str的下一个标记(分隔符),并将它用'\0'代替。我们就拿到了zhangsan这个关键信息,再返回一个指向这个分割符的指针以记入位置
3.如果strok的第一个参数为str,则函数会找到字符串中的第一个分隔符,并保存它的位置
4.如果strok的第一个参数为NULL,则函数会在上次保存的位置查找下一个分隔符,并保存它的位置
5.如果字符串之后没有更多的分割符,就会返回NULL
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
char arr1[] = "[email protected]";
char arr2[30] = { 0 };
strcpy(arr2, arr1);
const char* p = "@.";
char* s = NULL;
for (s = strtok(arr2, p); s != NULL; s = strtok(NULL, p))
{
printf("%s\n", s);
}
return 0;
}
根据以上的代码我们可以发现,关键信息被提出来了。
我们今天就介绍到这里
感谢支持!