🎁🎁创作不易,关注作者不迷路🎀🎀
前言
文章干货满满,还请您细细品读,如果您细心读完,相信您对于字符函数和字符串函数的理解将上升一定维度,如果您觉得作者写得不错,抑或对您有所帮助,不妨给俺点个免费的赞和玩玩呢? 关注作者不迷路,后续将有更多原创内容更新哟
在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了⼀系列库函数,接下来我们就学习⼀下这些函数。
一、字符分类函数
C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h
这些函数的使⽤⽅法⾮常类似,我们就讲解⼀个函数的事情,其他的⾮常类似:
int islower ( int c );
islower 是能够判断参数部分的 c 是否是⼩写字⺟的。
通过返回值来说明是否是⼩写字⺟,如果是⼩写字⺟就返回⾮0的整数,如果不是⼩写字⺟,则返回0。
二、字符转换函数
C语⾔提供了2个字符转换函数:
int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写
三、 strlen的使⽤和模拟实现
size_t strlen ( const char * str );
1.在使用时,需要注意的事项:
• 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包
含 '\0' )。
• 参数指向的字符串必须要以 '\0' 结束。
• 注意函数的返回值为size_t,是⽆符号的( 易错 )
• strlen的使⽤需要包含头⽂件
2.strlen的模拟实现:
在对strlen函数实现时,我们考虑到使用递归函数的思想进行实现,以表达式 1+my_strlen(str+1) 来实现大事化小的目的;再给出终止条件,实现回归,得到结果。具体思想如下:
代码如下:
int my_strlen(const char * str)
{
assert(str);
if(*str == '\0')
return 0;
else
return 1+my_strlen(str+1);
}
当然,亦存在其他实现方式,如 指针-指针的⽅式 等等,有兴趣不妨您进行思考,将答案展现在评论区让给多读者看到您的智慧。
四、strcpy的使⽤和模拟实现
char* strcpy(char * destination, const char * source );
•源字符串必须以 '\0' 结束。
• 会将源字符串中的 '\0' 拷⻉到⽬标空间。
• ⽬标空间必须⾜够⼤,以确保能存放源字符串。
• ⽬标空间必须可修改。
以下举出strcpy使用时的常见错误,望读者避免:
这里数组arr2中仅存放一个数字零,导致arr1在复制后,存放到arr2中时没有足够的空间存放而发生错误 p中存放的是一个常量字符串的地址,不满足目标空间必须是可修改的这一要求
strcpy的模拟实现:
char* my_strcpy(char *dest, const char*src)
{
char *ret = dest;
assert(dest != NULL);
assert(src != NULL);
while((*dest++ = *src++))
{
;
}
return ret;
}
针对这里的判断条件while((*dest++ = *src++))解释一下,以方便读者理解。
*dest++ = *src++这里是后置加加,先调用再加加,意思是先将*src赋给*dest后两指针再分别向后移动一位,当src移动到‘\0’时赋给*dest后,括号内就等价于0,条件为假,跳出循环
五、 strcat的使⽤和模拟实现
使用strcat函数时,需要注意以下几点:
• 源字符串必须以 '\0' 结束。
• ⽬标字符串中也得有‘ \0’ ,否则没办法知道追加从哪⾥开始。
• ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
• ⽬标空间必须可修改。
模拟实现strcat函数:
char *my_strcat(char *dest, const char*src)
{
char *ret = dest;
assert(dest != NULL);
assert(src != NULL);
while(*dest)
{
dest++;
}
while((*dest++ = *src++))
{
;
}
return ret;
}
对比发现,strcat函数实现时,与strcpy函数实现二者的代码中判断条件均为 while((*dest++ = *src++)),想必不必再做解释,唯一区别在于判断条件前边又加入一个条件,这里是将指针位置移动至目标字符的‘\0’处。
那么此时我们思考一个问题,字符串⾃⼰给⾃⼰追加,如何?
显然这是一个死循环问题,因为在使用该函数时,会将目标字符串的‘\0’替代掉,而没有‘\0’就失去了结束标志,进而程序将无休止的进行下去,形成死循环。
图解如下:
六、strcmp的使⽤和模拟实现
• 标准规定:
◦ 第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
◦ 第⼀个字符串等于第⼆个字符串,则返回0
◦ 第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
◦ 那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩。
strcmp函数的模拟实现:
int my_strcmp (const char * str1, const char * str2)
{
int ret = 0 ;
assert(str1 != NULL);
assert(str2 != NULL);
while(*str1 == *str2)
{
if(*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1-*str2;
}
七、strncpy函数的使⽤
char * strncpy ( char * destination, const char * source, size_t num );
•对比发现,strncpy相比于strcpy多出一个参数size_t num ,此参数用于控制拷⻉从源字符串到⽬标空间的字符个数。
• 如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。
八、strncat函数的使⽤
char * strncat ( char * destination, const char * source, size_t num );
九、 strncmp函数的使⽤
int strncmp ( const char * str1, const char * str2, size_t num );
⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0.
以上就是关于【C语言篇】qsort函数超详细讲解拆分 +【C语言指针详解(四)】的内容啦,各位大佬有什么问题欢迎在评论区指正,您的支持是我创作的最大动力!