C语言(字符、字符串函数)1

2024-06-04 2604阅读

                       Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注+收藏,欢迎欢迎~~     

                        💥个人主页:小羊在奋斗

                        💥所属专栏:C语言   

        本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为同样是初学者的学友展示一些我的学习过程及心得。文笔、排版拙劣,望见谅。 

                                1、字符分类函数

                                2、字符转换函数

                                3、strlen 的使用和模拟实现

                                4、strcpy 的使用和模拟实现

                                5、strcat 的使用和模拟实现

1、字符分类函数

        C语言中有一些专门作字符分类的函数,使用这些函数需要包含头文件 ctype.h 。

isalnum

检查一个字符是否是字母或数字

(函数)

isalpha

检查一个字符是否是字母

(函数)

islower

检查一个字符是否是小写字母

(函数)

isupper

检查一个字符是否是大写字母

(函数)

isdigit

检查字符是否为数字

(函数)

isxdigit

检查一个字符是否是十六进制的字符

(函数)

iscntrl

检查一个字符是否是控制字符

(函数)

isgraph

检查一个字符是否是图形字符

(函数)

isspace

检查一个字符是否是空白字符

(函数)

isblank

(C99)

检查一个字符是否是空格字符

(函数)

isprint

检查一个字符是否是可打印字符

(函数)

ispunct

检查一个字符是否是标点字符

        更多详细内容请点击跳转阅读 —> C 标准库头文件 - cppreference.com 


C语言(字符、字符串函数)1 第1张

        这些函数的使用方法、返回值等基本是一致的,这里就以 islower 函数为例,写一个将字符串中非大写的字母转化为大写字母的示例。

 C语言(字符、字符串函数)1 第2张

 2、字符转换函数

        C语言中有两个实现大小写转换的函数,tolower(将大写字母转小写) 和 toupper(将小写字母转大写)。

C语言(字符、字符串函数)1 第3张

        那既然有了这两个函数,上面将字符串中的小写字母转换为大写字母的代码就可以优化一下了。

 C语言(字符、字符串函数)1 第4张

3、strlen 的使用和模拟实现

        3.1 strlen 的返回值

        strlen 函数我们已经非常的熟悉,之前也介绍了两种模拟 strlen 函数的方法,这里再关于 strlen 的使用做一些补充,同时再介绍另一种 strlen 的模拟实现方法。

        C语言(字符、字符串函数)1 第5张

        以前我们在使用 strlen 函数的时候,可能没有细心地关注过 strlen 的返回值类型,有时候我们使用 int 类型来接收它的返回值好像也没出现什么问题,但其实这是一个很值得我们去注意的一个问题。来看下面的示例:

C语言(字符、字符串函数)1 第6张

        按道理来说-3小于0应该打印的是“”。而如果我们想让它输出我们想要的结果,只需要强制类型转换就行。

C语言(字符、字符串函数)1 第7张

        3.2 strlen 的模拟实现 

         之前的文章中我们用了指针遍历数组和指针-指针两种方法来模拟实现 strlen 函数,这里我们再使用另一种方法来模拟实现——递归。

#include 
#include 
size_t my_strlen(char* str)
{
	assert(str != NULL);
	if (*str != '

4、strcpy 的使用和模拟实现

') { return 1 + my_strlen(++str); } else { return 0; } } int main() { char str[] = "Are you ok?"; size_t len = my_strlen(str); printf("%zd\n", len); return 0; }

C语言(字符、字符串函数)1 第8张

        我们之前说过,递归就是一个把大事化小的过程,适合于解决一些简单重复的操作,就像上面重复读取一个字符并判断的过程。这个方法很简单,一眼就能明白其中的原理,我就不过多阐述了。值得一说的是,这个方法并没有创建新变量,这是区别于前两种方法的地方。 

        4.1 strcpy 的用法 

        4.2 strcpy 的模拟实现 

        strcpy 是一个字符串拷贝函数,它的作用是把第二个参数所指的字符串拷贝给第一个参数所指的字符串数组中,注意不要搞反了。

        更多详细介绍请点击查阅 —> strcpy, strcpy_s - cppreference.com

         C语言(字符、字符串函数)1 第9张

        使用 strcpy 也需要包含头文件 ,是比较简单的,但是有几个需要特别注意的点。 

(1)源字符串必须以 ‘\0’ 结束;

        就像 strlen 函数一样,strcpy 函数也需要知道它应该在哪里停止拷贝。 

(2)会将源字符串中的 ‘\0’ 拷贝到目标空间;

         在上面的代码中我们使用 strlen 函数证明了这点。

(3)目标空间必须足够大,以确保能放得下字符串;

        以上面的代码为例,如果我们定义的字符数组 str2 太小,程序就会出错。

C语言(字符、字符串函数)1 第10张  

(4)目标空间必须可修改。

         这里举个反例来证明这一点。

C语言(字符、字符串函数)1 第11张

        将常量字符串 “abc” 存到字符指针变量 ps 中,之前说过常量字符串是不能被修改的,所以程序就出错了。 

#include 
#include 
#include 
void my_strcpy(char* dest, const char* sour)
{
	assert(dest != NULL);
    assert(sour != NULL);
	while (*sour != '

        4.3 strcpy 的返回值 

') { *dest = *sour; sour++; dest++; } *dest = *sour;//
#include 
#include 
#include 
char* my_strcpy(char* dest, const char* sour)
{
	assert(dest != NULL);
	assert(sour != NULL);
	char* pd = dest;
	while (*sour != '

        4.4 strcpy 模拟实现的优化 

') { *dest = *sour; sour++; dest++; } *dest = *sour;//

5、strcat 的使用和模拟实现

return pd; } int main() { char str1[] = "what can I say? man."; char str2[50] = { 0 }; char* ps = my_strcpy(str2, str1); printf("%s\n", ps); printf("%s\n", my_strcpy(str2, str1)); printf("%zd\n", strlen(str2)); return 0; }
} int main() { char str1[] = "what can I say? man."; char str2[50] = { 0 }; my_strcpy(str2, str1); printf("%s\n", str2); printf("%zd\n", strlen(str2)); return 0; }

        就像 strlen 函数一样,我们同样也可以模拟实现一个 strcpy 函数,完成字符串拷贝的功能。 

         5.1 strcat 的用法

C语言(字符、字符串函数)1 第12张

        逻辑也是特别简单的,只不过我们要特别注意字符 ‘\0’ 也需要拷贝过去。

        5.2 strcat 的返回值

C语言(字符、字符串函数)1 第13张

        关于 strcpy 函数我们可能会忽略了它的返回值,因为我们会觉得这个函数并不需要什么返回值,但其实它是有返回值的,既然有返回值,那它的返回值就有用,所以严格来说我们上面模拟实现的 strcpy 函数返回值应该为 char * 而不是 void 。strcpy 函数返回的是目标字符串的首地址,这使得 strcpy 可以链式操作。

        所以上面的代码可以更新为:

        5.3 strcat 的模拟实现

C语言(字符、字符串函数)1 第14张

C语言(字符、字符串函数)1 第15张

#include 
#include 
char* my_strcat(char* dest, const char* sour)
{
	assert(dest != NULL);
	assert(sour != NULL);
	char* pd = dest;
	while (*dest++);
	dest--;//覆盖掉目标字符串中的
	while (*dest++ = *sour++);
	return pd;
}
int main()
{
	char str1[20] = "hello ";
	char str2[] = "world";
	char *ps = my_strcat(str1, str2);
	printf("%s\n", ps);
	return 0;
}

        虽然我们已经完成了 strcpy 函数的模拟实现,但上面的代码还可以优化。因为字符‘\0’的特殊,上面的代码中我们是将普通字符和‘\0’字符分开处理的,那是否可以有个办法将这两步合在一起呢?

        来体会下面这条代码:

C语言(字符、字符串函数)1 第16张

        我们用一条代码就实现了拷贝字符串,包括拷贝字符‘\0’。其中的原理也是非常简单,当字符‘\0’拷贝到目的空间后,括号中表达式的值为0,就自动跳出了循环。需要说明的是两个指针变量都是先解引用,然后再自增的。

        strcat 函数的作用是将源字符串拼接到目标字符串的后面。跟 strcpy 函数类似,strcat 是将第二个参数所指的字符串拼接到第一个参数所指的字符串后面。

        更多详细的介绍请点击阅读 —> strcat, strcat_s - cppreference.com

C语言(字符、字符串函数)1 第17张

        同样的,strcat 函数也有几个需要注意的点: 

        (1)源字符串必须以‘\0’结束;

        (2)目标字符串中也得有‘\0’,否则没法知道拼接在哪里;

        (3)目标空间必须足够大;

        (4)目标空间必须可修改。

C语言(字符、字符串函数)1 第18张

        类比 strcpy,strcat 也是有返回值的,并且返回值也是目标字符串的首地址。

C语言(字符、字符串函数)1 第19张

        我们依然可以自己写一个函数来模拟实现 strcat 的功能,方法很简单,类似于模拟实现 strcpy 的方法,我们只需要想办法将源字符串拼接到目标字符串末尾就行,相信对于现在有点基础的我们来说这并不是什么难事。

C语言(字符、字符串函数)1 第20张

        上面我们是将一个字符串与另一个字符串拼接在一起,那能不能将一个字符串拼接到自己的末尾呢?

C语言(字符、字符串函数)1 第21张

C语言(字符、字符串函数)1 第22张

        可以看到,用我们自己写的函数不能实现字符串自己拼接到自己后面,这是因为拼接的过程是在目标字符串末尾的 ‘\0’ 处开始拼接的,也就是说目标字符串的第一个字符会覆盖掉它自己末尾的 ‘\0’,那函数的第二个参数指针就永远也找不到 ‘\0’ 以结束拼接,就会陷入***循环。

        但是 strcat 函数可以,不过 strcat 函数并不能保证这件事情,也就是说上面能成功是偶然的。 

           如果觉得我的文章还不错,请点赞、收藏 + 关注支持一下,我会持续更新更好的文章。 

                                        点击跳转下一节 —> C语言(字符、字符串函数)2 


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]