C语言字符函数和字符串函数(1)
目录
前言
一、字符分类函数
1.常用的字符分类函数及其功能:
2.这些函数的返回值规则:
3.使用示例:
二、字符转换函数
1.C语⾔提供了2个字符转换函数:
三、strlen函数
1.介绍
2.模拟实现:
四、strcpy函数
1.介绍
2.模拟实现:
五、strcat函数
1.介绍
2.模拟实现:
六、strcmp函数
1.介绍
2.strcmp函数的模拟实现:指针法:
总结
前言
在编程时,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了 ⼀系列库函数,接下来我们就学习⼀下这些函数。
本文章将讲解内容如下:
1. 字符分类函数
2. 字符转换函数
3. strlen的使用和模拟实现
4. strcpy的使用和模拟实现
5. strcat的使用和模拟实现
6. strcmp的使用和模拟实现
7. strncpy函数的使用
8. strncat函数的使用
9. strncmp函数的使用
10. strstr的使用和模拟实现
11. strtok函数的使用
12. strerror函数的使用
本篇文章为1~6的讲解,下半部分会在C语言字符函数和字符串函数(2)中讲解。
一、字符分类函数
C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h。
#include<ctype.h>
1.常用的字符分类函数及其功能:
以下是常用的字符分类函数及其功能:
-
判断字母和数字
int isalnum(int c)
:检查字符是否为字母(a-z, A-Z)或数字(0-9)int isalpha(int c)
:检查字符是否为字母(a-z, A-Z)int isdigit(int c)
:检查字符是否为数字(0-9)
-
判断大小写字母
int islower(int c)
:检查字符是否为小写字母(a-z)int isupper(int c)
:检查字符是否为大写字母(A-Z)
-
判断空白字符
int isspace(int c)
:检查字符是否为空白字符(空格、制表符\t
、换行符\n
等)
-
判断其他属性
int iscntrl(int c)
:检查字符是否为控制字符(如\n
、\t
等)int isgraph(int c)
:检查字符是否为可打印且非空格字符int isprint(int c)
:检查字符是否为可打印字符(包括空格)int ispunct(int c)
:检查字符是否为标点符号int isxdigit(int c)
:检查字符是否为十六进制数字(0-9, a-f, A-F)
2.这些函数的返回值规则:
如果条件满足,即函数对应的要求成立,返回非0值,不符合,返回0.
3.使用示例:
这些函数的使⽤⽅法⾮常类似:
int islower ( int c );
通过此函数,判断参数c是否为小写字母,如果条件满足,即函数对应的要求成立,返回非0值,不符合,返回0.
习题例子:
写⼀个代码,将字符串中的⼩写字⺟转⼤写,其他字符不变。
#include<stdio.h>
#include<ctype.h>
int main()
{
char p[]="ABCdef";
int i=0;
char c;
while(p[i]!='\0')
{
c=p[i];
if(islower(p[i]))
{
c-=32;
p[i]=c;
}
i++;
}
printf("%s",p);
}
如果记不住这些函数也没太大影响,如上方的islower,我们可以用 if(p[i]>='a'&&p[i]<='z') 来代替,同理,其他函数均可这样做。
二、字符转换函数
1.C语⾔提供了2个字符转换函数:
1. int tolower (int c)
2. int toupper(int c)
int tolower (int c)函数的作用为将大写字母转化成小写字母;
同理 int toupper(int c)函数的作用为将小写字母转化成大写字母;
上方习题中c-=32;我们可以用toupper(c)来实现;当然我们如果记不住字符转换函数的话,就记一下每个大写字母与其对应的小写字母之间差32个ASCLL值即可。
三、strlen函数
1.介绍
size_t strlen ( const char * str );
统计参数指向的字符串的⻓度。统计的是字符串中 '\0' 之前的字符的个数,如果该字符串没有‘\0’,该结果为随机值:
int main()
{
char p[]="ABCdef";
int i,j;
char q[]={'a','b'};
i=strlen(p);
j=strlen(q);
printf("%d %d",i,j);
}
我们由此可知:p达到了预期的目标,但q没有。
2.模拟实现:
该函数可有多钟实现方式:
指针法:
int mystrlen(char *p)
{
char *q=p;
while(*q)
{ q++;
}
return q-p;
}
int main()
{
char p[]="ABCdef";
int i,j;
i=mystrlen(p);
printf("%d",i);
}
统计个数求法:
int mystrlen(char *p)
{
int i=0;
while(*p)
{
p++;
i++;
}
return i;
}
int main()
{
char p[]="ABCdef";
int i,j;
i=mystrlen(p);
printf("%d",i);
}
递归求法:
int mystrlen(const char * str)
{
assert(str);
if(*str == '\0')
return 0;
else return 1 + mystrlen(str+1);
}
int main()
{
char p[]="ABCdef";
int i,j;
i=mystrlen(p);
printf("%d",i);
}
结果也一样正确。
四、strcpy函数
1.介绍
char* strcpy(char * destination, const char * source );
功能:字符串拷⻉,拷⻉到源头字符串中的 \0 为⽌,即将代码中source的字符全拷贝至 destination中。
destination :指针,指向⽬的地空间(目的字符串)
source :指针,指向源头数据(源头字符串)
返回值:strcpy 函数返回的⽬标空间的起始地址
int main()
{
char arr1[10] = {0};
char arr2[] = "hello";
strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
我们由此可知:该函数将arr2的内容拷贝到了arr1中。
注意:
1.源字符串必须以 '\0' 结束。
2.该函数会将源字符串中的 '\0' 拷⻉到⽬标空间。
3.⽬标空间必须⾜够⼤,以确保能存放源字符串。
4.⽬标空间必须可修改,常量字符串进行拷贝是不行的。
2.模拟实现:
指针法:
char* mystrcpy(char *a1, char*a2)
{ char *ret=a1;
while(*a2)
{
*a1=*a2;
a1++,a2++;
}
*a1 = '\0';
return ret;
}
int main()
{
char arr1[10] = {0};
char arr2[] = "hello";
mystrcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
运行结果一样的。
五、strcat函数
1.介绍
char * strcat ( char * destination, const char * source );
功能:字符串追加,将源头字符串中的全部字符,即将代码中source的字符全追加至 destination结尾。
destination :指针,指向⽬的地空间
source :指针,指向源头数据
返回值rcat 函数返回的⽬标空间的起始地址
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
我们由此可知:该函数将arr2的内容追加到了arr1中。
注意:
1.源字符串必须以 '\0' 结束。
2.⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
3.⽬标空间必须⾜够⼤,以确保能存放源字符串。
4.⽬标空间必须可修改,常量字符串进行拷贝是不行的。
这几条要求与strcpy要求类似。
2.模拟实现:
指针法:
char *mystrcat(char *a1,char *a2)
{
char *p=a1;
while(*a1)
{
a1++;
}
while(*a2)
{
*a1=*a2;
a1++;
a2++;
}
*a1='\0';
return p;
}
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
mystrcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
运行结果一样的。
六、strcmp函数
1.介绍
int strcmp ( const char * str1, const char * str2 );
功能:用来比较str1 和str2 指向的字符串,从两个字符串的第⼀个字符开始⽐较,如果两个字符的ASCII码值相等,就比较下⼀个字符。直到遇到不相等的两个字符,或者字符串结束。
str1 :指针,指向要⽐较的第⼀个字符串。
str2 :指针,指向要⽐较的第⼆个字符串。
返回值:strcmp 函数返回的两个字符串比较的值。
返回值规定:
1.第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字。
2.第⼀个字符串等于第⼆个字符串,则返回0。
3.第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字。
代码示例:
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abq";
int ret = strcmp(arr1, arr2);
printf("%d\n", ret);
if(ret > 0)
printf("arr1 > arr2\n");
else if(ret == 0)
printf("arr1 == arr2\n");
else
printf("arr1 < arr2\n");
return 0;
}
对此代码解释:
strcmp比较大小为逐一比较,如果相等,则转向下一个字符。
2.strcmp函数的模拟实现:
指针法:
int mystrcmp(char *a,char *b)
{
while(*a==*b)
{
if(*a=='\0')
{
return 0;
}
a++;
b++;
}
return *a-*b;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abq";
int ret = mystrcmp(arr1, arr2);
printf("%d\n", ret);
if(ret > 0)
printf("arr1 > arr2\n");
else if(ret == 0)
printf("arr1 == arr2\n");
else
printf("arr1 < arr2\n");
return 0;
}
对该方法介绍一下:
通过循环比较字符直到不同或遇到结束符 '\0'
,返回字符差值,这样的方式即可得到结果。
总结
以上就是今天要讲的内容,本文简单介绍了:
1. 字符分类函数
2. 字符转换函数
3. strlen的使用和模拟实现
4. strcpy的使用和模拟实现
5. strcat的使用和模拟实现
6. strcmp的使用和模拟实现
知识的相关内容,为本章节知识的内容,希望大家能喜欢我的文章,谢谢各位。