字符函数,字符串函数是C语言中非常重要的函数族,它们在日常的编程过程中被广泛使用。它们不仅能够大大提高我们的编程效率,还可以为我们提供更灵活、更高效的操作方法。在本篇博客中,我们将一起深入了解这二类函数的基本概念和使用方法。话不多说我们开始吧!(制作不易恳求三连)
文章目录
- 1,字符函数
- 字符分类函数
- 字符转换函数
- 2,字符串函数
- strlen
- strcpy
- strcat
- strcmp
- strncpy,strncat,strncmp
- strstr
- strtok
- strerror
- perror
- 3,结尾
1,字符函数
字符分类函数
正如它的名字,它的作用是用来做字符分类的,那包含那些呢?正如下图所示。
其中控制字符为ASCII值0-31和127。
图形字符为+,-,*,/,%,<,>,!,&,|,^,~,_,·,(,),[,],{,},?,:,;,,,",',#,\。
这些函数的头文件都是ctype.h,在使用时不要忘记加上。
这里每个函数的使用方法都差不多,只要学会一个其他的自然也都会使用,我来为大家演示一下比较常用的isdigit函数。
//输入一串字符串只输出其中的数字部分
#include<stdio.h>
#include<ctype.h>
int main()
{char ch[100] = { 0 };for (int i = 0; scanf("%c", &ch[i]) != EOF; i++){if (isdigit(ch[i]))//判断是否为数字0~9 如果是返回值为参数所表示数字不然为0printf("%c", ch[i]);}return 0;
}
运行结果如下。
字符转换函数
比较基本的字符转换函数有两个一个是 tolower 一个是 toupper。正如其英文直译过来一样,第一个可以把大写字母转换为小写字母,另一个则是把小写字母转化为大写字母。下面我简单来示范一下toupper函数的使用方式。
#include<stdio.h>
#include<ctype.h>
int main()
{char ch[] = "abcdef";for (int i = 0; i <= 6; i++){printf("%c",toupper(ch[i]));//把小写字母转化为大写字母其返回值为转化后字母的ASCII值所以可以直接打印其返回值}return 0;
}
tolower函数使用方法也类似可以比照着使用。
2,字符串函数
字符串函数有许多个,使用他们需要带上string.h头文件,接下来我将以介绍,使用,模拟三个流程对每个字符串函数进行讲解。
strlen
介绍
相必大家对这个函数并不陌生,这个就是用来计算字符串长度的函数从起始位置开始直到遇见’\0’时停止统计中间的字符个数。如果所给字符串中没有‘\0’,则会产生一个随机值,因为strlen函数会继续沿着地址寻找‘\0’直到找到才停止。
使用
#include<stdio.h>
#include<string.h>
int main()
{char ch[] = "abcdef";printf("%zu", strlen(ch));//注意strlen的返回类型时无符号形整数return 0;
}
注意strlen函数的返回值是无符号形整数,再进行加减运算比大小时很容易出错。
模拟
我们可以以如下方式自己来模拟一下srlen函数来增加对其的理解。
size_t my_strlen(char* arr)//第一种写法统计\0之前的字符个数
{int len = 0;for (int i = 0; arr[i] != '\0'; i++){len++;}return len;
}
size_t my_strlen(char* arr)//第二种写法递归
{if(!(*arr))return 0;elsereturn 1+my_strlen(arr+1);
}
size_t my_strlen(char* arr)//第三种写法指针-指针=两指针(地址)间元素的个数
{char* a = arr;while(*arr != '\0')arr++;return arr - a;
}
strcpy
介绍
这个函数用于字符串的拷贝,上图中的source参数我们称之为源字符串,改函数中的作用是把源字符串中的内容拷贝到destination字符串(目的字符串)中(源字符串中的\0也会拷贝过去)。
需要注意的是目的字符串要足够容纳的下源字符串并且源字符串末尾一定要有\0。
使用
#include<stdio.h>
#include<string.h>
int main()
{char ch[] = "abcdef";char ch1[] = "fed";printf("%s", strcpy(ch,ch1));//现在ch中储存的字符为f,e,d,\0,e,f,\0所以只会打印fed,strcpy的返回值为目的字符串的首元素地址。return 0;
}
模拟
char* my_strcpy(char* arr,const char*arr2)
{char* ret = arr;//记录首元素地址while(*arr++=*arr2++)//当arr2为\0时结束循环,先使用再加。{;}return ret;
strcat
介绍
该函数可以再目的字符串的末尾的’\0’处追加上一段与源字符串一样的字符串。比如对hello\0和wolrd\0这两个字符串使用后会变成helloworld\0.
注意事项与strcpy类似,值得注意的还有目的字符串也许要以\0为结尾不然不知道在哪里开始追加。
使用
#include<stdio.h>
#include<string.h>
int main()
{char ch[10] = "abcdef";char ch1[] = "fed";printf("%s", strcat(ch,ch1));//返回值为目的字符串首元素的地址return 0;
}
模拟
char* my_strcat(char* arr, const char* arr2){char* ret = arr;while (*arr != '\0')//找到\0后停止{arr++;}while (*(arr++) = *(arr2++)){;}return ret;}
strcmp
介绍
该函数是用来对两个字符串来比较大小的,第⼀个字符串大于第二个字符串,则返回大于0的数字第⼀个字符串等于第二个字符串,则返回0 第⼀个字符串小于第二个字符串,则返回小于0的数字,我来举几个例子。
“abcd”“abcf” 比较方式是先从每个字符串的起点来比较a=a,b=b,c=c,d<f(d的ASCII值小于f的),所以第二个字符串大于第一个字符串。
“abc” “abcd” 当比较完c后发现第一个字符串没东西了所以自然第二个字符串大于第一个字符串。
“abcfef” “abfdef” 当比较到c<f时停止比较,字符串2大于字符串1。
使用
#include<stdio.h>
#include<string.h>
int main()
{char ch[10] = "abcdef";char ch1[] = "fed";int ret = strcmp(ch, ch1);if (ret < 0)printf("小于");else if (ret > 0)printf("大于");else printf("等于");return 0;
}
一定不要记错最初安比较是按位比较的.
模拟
int my_strcmp(const char* arr, const char* arr2){while (*arr == *arr2){if (*arr == '\0')return 0;//两字符串相等arr++;//进到下一位来比较arr2++;}if (*arr > *arr2)return 1;else if (*arr < *arr2)return -1;}
strncpy,strncat,strncmp
介绍
这三个函数与他们的不带n版本比较类似下面我来意义给大家介绍。
strncpy比着strcpy多了一个size_t类型的参数,用来表示拷贝字符的个数,拷贝n个字符从源字符串到目标空间。
如果源字符串的长度小于n,则拷贝完源字符串之后,在目标的后边追加、0,直到拷贝n次后结束。
同理strncat将源字符串的前n个字符追加到目的字符串末尾,再追加⼀个 \0 字符。如果源字符串的长度小于n的时候,只会将字符串中到\0 的内容追加到目的字符串末尾。
strncmp则是将源字符串与目的字符串前n个字符进行比较,比较出大小。
这三者的使用和模拟与原版差不多不再进行演示有兴趣的可以自己尝试。
strstr
介绍
char* strstr ( const char * str1, const char * str2);
这个函数的作用是在一个字符串中查找另外一个字符串,即在str1转向的字符串中查找str2指向的字符串。如果找到函数会返回所查找字符串在str1所指向的字符串中第一次出现的位置(不比较\0),如果找不到则会返回NULL。
使用
#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "w!wwr!,wwr,wwwwwwr";char arr2[] = "!,";printf("%p %p", strstr(arr, arr2), arr);//打印出所查找字符串所在的地址和arr的地址来对比return 0;
}
发现刚好差值为5说明所查找的字符串在arr中下标为5的地方可以找到。
模拟
char* my_strstr(const char* arr, const char* arr2)
{if (*arr2 == '\0')//如果arr2为空则直接返回ar首元素的地址return arr;while (*arr)//当*arr=\0时出循环{int flag = 0;char* ret = arr;//储存char* wwr = arr2;if (*arr == *arr2)//当元素相等时进入循环{while (*arr2)//当*arr2=\0时出循环{if (*arr != *arr2){flag = 1;arr = ret + 1;arr2 = wwr;break;}arr++;arr2++;}if (flag == 0)return ret;//找到了}elsearr = ret + 1;//没找到从arr的下一位开始查找}return NULL;
}
该流程为暴力解法,从arr的第一个元素开始查找看是否能找到arr2找不到则返回arr下一个元素继续查找,虽然能解决问题但是步骤繁琐,时间还长,这时我们就可以采用kmp算法来解决。(比较长以后再讲,有兴趣的可以去b站搜索学习一下)
strtok
介绍
char * strtok ( char * str, const char * sep)
假设有一个字符串“abc,bad。ckl、”我们想把这个字符串分成abc,bad,ckl这三个字符串,也就是说,。、这三个字符我们就可以把他们三个字符装进一个字符串中,然后将这个字符串的字符用strtok函数定义成分隔符sep,每当一个str指向的字符串中出现这三个字符之一就会以这个字符为切口一分为二变成两个字符串。
strtok函数找到str中的⼀个标记,strtok函数将保存它在字符串中的位置。并将其用 \0 结尾,返回⼀个指向这个标记的指针。
当strtok的第一个参数为NULL时,函数将在同一个字符串中上一次被保存的位置开始,查找下⼀个标记。 如果字符串中不存在更多的标记,则返回 NULL 指针。
注意strtok函数会改变被操作的字符串,在使用strtok函数切分的字符串⼀般要使用临时拷贝并且可修改的内容。
使用
#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "w!wr,wwr,wwwwwwr";char arr2[] = "!,";//a为临时变量用来储存被分割的字符串。for(char * a= strtok(arr, arr2);a!=NULL;a= strtok(NULL, arr2))//一开始a= strtok(arr, arr2)可以得到第一次被分割后靠前的字符串,此时strtok已经保存了切割点的位置下一次只需要让a= strtok(NULL, arr2)即可找到上一次切割的地方再继续查找切割点,如果找不到了的话a就会等于NULL并退出循环。{printf("%s\n",a);}return 0;
}
结果显然arr被分成了四个字符串。
该函数模拟起来比较麻烦暂不展示。
strerror
介绍
char * strerror ( int errnum );
在c语言的标准库中规定了一些错误码,放在errno.h这个头文件中说明,在程序启动时会产生一个全局变量errno来记录程序当前的错误码一开始errno为0表示没有错位,一旦程序发生了某种错误就会产生对应的错误码存放在errno这个变量中,每个错误码都有对应的错误信息,strerror函数就可以将错误对应的错误信息字符串对应的的地址作为返回值,你可以根据返回的地址打印出错误信息。
使用
假如我们得到的错误码为1,那么我们就可以通过这个函数在找到错误码对应的错误信息字符串的地址。
#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{int i = 1;//错误码printf("%s", strerror(i));//找出错误信息的地址并打印字符串return 0;
}
输出的错误信息自然就是1这个错误码所对应的错误信息,还有许多其他的错误码吗,小伙伴们可以自己去尝试。
perror
那我们就不得不说说perror函数了。该函数可以直接打印出当前程序对应的错误码的错误信息。
也就是说printf(“%s”, strerror());这句话可以直接用perror();来代替。
3,结尾
想必看到这里,大家都对这两种函数有了一定程度掌握,一定不要忘了巩固练习,不然过一段时间都会忘记,希望大家都能够熟练掌握。
制作不易给个赞,收藏,关注吧!!!