【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数

这篇具有很好参考价值的文章主要介绍了【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

💓作者简介: 加油,旭杏,目前大二,正在学习C++数据结构等👀
💓作者主页:加油,旭杏的主页👀

⏩本文收录在:再识C进阶的专栏👀

🚚代码仓库:旭日东升 1👀

🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖

学习目标:

       在上一篇博客中,我们学习了字符串函数,字符串是由字符构成的,那么这篇博客将会为大家讲解字符分类函数字符转换函数以及内存函数,那么字符就又有了一片新天地。这篇博客还是会很简单的,废话不多说,我们来开始写博客。


学习内容:

通过上面的学习目标,我们可以列出要学习的内容:

  1. 字符分类函数
  2. 字符转换函数
  3. 内存函数 

一、字符分类函数

先来看一下全部字符分类函数的大纲,总共有12个,请看下面表格:

函数 如果他的参数符合下列条件就返回真
iscntrl 任何控制字符
isspace 空白字符:空格;换页'\f';换行'\n';回车'\r',制表符'\t'或者垂直制表符'\v'
isdigit 十进制数字 0~9
isxdigit 十六进制数字,包括所有的十进制数字,小写字母 a~f,大写字母 A~F
islower 小写字母 a~z
isupper 大写字母 A~Z
isalpha 小写字母 a~z 或大写字母 A~Z
isalnum 字母或者数字,a~z,A~Z,0~9
ispunct 标点符号,任何不属于数字或者字母的圆形字符(可打印)
isgraph 任何圆形字符
isprint 任何可打印的字符,包括圆形字符和空白字符

1.1 iscntrl字符函数

1.1.1 控制字符的概念(了解一下)

       在小编刚听到这个函数时,我在纳闷控制字符是什么?控制字符的概念简单来讲,就是出现于特定的信息文本中,表示某一控制功能的字符。

       精确来讲,就是在ASCII码中,第0~31号及第127号(共33个)是控制字符或通讯专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等。

1.1.2 iscntrl函数的作用

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

       其功能就是检查字符c是否为控制字符,如果是,则返回真(非0的数,有可能是负数),如果不是,则返回假。 

1.2  isspace字符函数

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

       其功能是检查字符c是否为空白字符,空白字符的概念在上面表格已经写的很详细了,当然在图中也很清楚。 

1.3  isdigit字符函数

       这个函数还是用的比较多的,因为其功能是检查字符c是否为十进制数字,十进制数字想必大家都很清楚,所以这个函数还算能用的上(大家还是要重视一下)。

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

1.4 isxdigit字符函数

       这个函数的范围和上面的isdight字符函数差不多,所以小编推断这个函数应该会用的很少,但还是要看一下,有个印象。这个函数的功能是检查字符c是否为十六进制数字,包括所有的十进制数字,小写字母 a~f,大写字母 A~F。

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

1.5  islower字符函数

       这个函数就有点意思,功能是检查字符c是否为小写字母,在一些题目中可能会用到这个函数,这个函数还是要记住为好。

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

举个例子:

题目:请回答出你所你输入的字符串中小写字母的个数为多少?

代码:

#include <stdio.h>
#include <ctype.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	char arr[20];
	for (int i = 0; i < n; i++)
	{
		scanf("%c", &arr[i]);
	}
	int count = 0;
	for (int i = 0; i < n; i++)
	{
		if (islower(arr[i]))
		{
			count++;
		}
	}
	printf("%d\n", count);
	return 0;
}

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

1.6 isupper字符函数

       有了检查是否为小写字母的函数,那必然会有检查大写字母的字符函数,同样,我们在网站来看看这个函数吧!这个用法是和上面的字符函数的用法是基本一样的,这里就不在赘述。

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

1.7  isalpha字符函数

       这个函数就是将 islower 字符函数和 isupper 字符函数结合起来,其功能是将检查是否为26个英文字母。个人感觉不是很好用,因为其的范围实在是太大了。

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

二、字符转换函数

       字符转换函数一共有两个,一个是 tolower 字符函数,一个是 toupper 字符函数。这两个字符还是比较重要的,因为在题目的求解中会用到这两个字符函数。我们需要先来了解这两个字符函数的功能之后,我们再来用一个习题进行巩固练习。

2.1 tolower字符函数

2.1.1 函数功能

       这个函数将判断所选的字符c是否为大写字母,如果是大写字母的话,将这个字符c转换为小写字母;如果不是大写字母,将不会转换这个字符c。大致工作原理就是利用 islower 字符函数进行判断,然后将这个字符函数进行处理即可。

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

2.1.2 函数例题

题目:

       将一个字符串中的所有大写字母变成对应的小写字母,其它字母不变。例如:对字符串“ABC12! EF”执行函数后输出结果为“abc12! ef”。

代码:

       这道题目的代码, 我们用两种方式进行解决,一种是运用库函数tolower,一种是不运用这个函数,我们来进行一些区别。

//如果使用库函数, 写的代码
void toUp(char* str)
{
    int len = strlen(str);
    for (int i = 0; i < len; i++)
    {
        if (isupper(*(str + i)))
        {
            *(str + i) = tolower(*(str + i));
        }
    }
}
//如果不用库函数,代码会是什么样子的
void toUp(char* str)
{
    int len = strlen(str);
    for (int i = 0; i < len; i++)
    {
        if (str[i] >= 'a' && str[i] <= 'z')
        {
            str[i] = str[i] - 32;
        }
    }
}

2.2 isupper字符函数

2.2.1 函数功能

       这个函数将判断所选的字符c是否为小写字母,如果是小写字母的话,将这个字符c转换为大写字母;如果不是小写字母,将不会转换这个字符c。大致工作原理就是利用 isupper 字符函数进行判断,然后将这个字符函数进行处理即可。

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

2.2.2 函数例题

题目:

       将一个字符串中的所有小写字母变成对应的大写字母,其它字母不变。例如:对字符串“abc12! ef”执行函数后输出结果为“ABC12! EF”。

代码:

       这道题目的代码, 我们用两种方式进行解决,一种是运用库函数tolower,一种是不运用这个函数,我们来进行一些区别。

//如果使用库函数, 写的代码
void toUp(char* str)
{
    int len = strlen(str);
    for (int i = 0; i < len; i++)
    {
        if (islower(*(str + i)))
        {
            *(str + i) = toupper(*(str + i));
        }
    }
}
//如果不用库函数,代码会是什么样子的
void toUp(char* str)
{
    int len = strlen(str);
    for (int i = 0; i < len; i++)
    {
        if (str[i] >= 'a' && str[i] <= 'z')
        {
            str[i] = str[i] - 32;
        }
    }
}

2.3 最后进行总结一下

       在这两个函数中,我们可以看见这两个函数的返回类型和形式参数基本是一样的,但是我们返回的是字符,而不是整形数字,为什么这两个函数的返回类型是 int 呢?

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

三、内存函数

       内存函数就是内存相关的函数,这些函数有4个:memcpymemmovememsetmemcmp

       如果我们将这种函数和上一篇字符串函数是有点相似的,但是我们已经有了字符串函数进行拷贝了,为什么还要用内存函数进行拷贝呢?大家要把视野放宽一下,在内存中不仅仅只有字符串,还有其他类型的数据需要拷贝!那么我们开始进行学习吧!

3.1 memcpy内存函数

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

3.1.1 函数功能

       这个函数的功能是复制内存块,将从源头指向的位置开始往后的num个字节复制到目标指向的内存块中。乍一看,感觉和strcpy字符函数的功能有点像,但是他们两个还是有不同,请看下面的对比图:

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

3.1.2 函数使用 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
	int arr1[5];
	int arr2[] = { 0,1,2,3,4 };
	memcpy(arr1, arr2, 5 * sizeof(int));
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

3.1.3 模拟实现一下memcpy函数

void my_memcpy(void* dest, const void* src, size_t num)
{
	assert(dest && src);
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
}

       当看完模拟实现的过程后,我们可以看出在while循环中指针的变化可能不止一种写法,但是其他的写法会在不同的编译器中会出现漏洞。比如说下面的代码在c文件中可以编译过去,而在cpp文件中编译不过去。

void* my_memcpy(void* dest, const void* src, size_t num)
{
	assert(dest && src);
    void* ret = dest;
	while (num--)
	{
		*(char*)dest = *(char*)src;
		((char*)dest)++;
		((char*)src)++;
	}
    return dest;
}

3.1.4 有关这个函数的一些问题

       在这个函数的开头,小编放了一张图片,在其上面我们有一些文字。小编再来解释一下什么意思?在前面我们学习了qsort函数,是不是与这个函数的思想有点相似呢?

  • 为什么他的类型是 void* 呢?因为在C语言中,这个函数将会拷贝所有内存块中的数据,所以他的类型必须是void*,这样其就能返回任何类型的数据。
  • 为什么 num 的单位是字节呢?因为数据类型中最小的单位是一个字节,如果我们一个字节一个字节的进行拷贝,我们就可以将所有类型的数据进行拷贝,这样的格局就大了。

3.2 memmove内存函数

       在前面我们学习了memcpy函数,发现其可以将内存中的数据拷贝到另一个内存中,那么我们现在有一个问题就是:加入一个数组arr,其内容放有1,2,3,4,5,6,7,7,9,10。   

       如果我们想要将1,2,3,4,5向后移动2格,可不可以用我们自己定义的memcpy函数呢?答案是否定的。我们可以通过调试进行验证。(为什么不用库函数中的memcpy函数,先卖个关子,之后会说)

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

       所以这就引出了这一部分我们要学习的函数——memmove函数,这个函数会将内存块中的数据进行移动,要与memcpy函数区分!接下来,我们来验证一下:

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

总结:

     memcpy函数是用于两个不重叠的内存中,将一个内存中的数据拷贝到另一个内存当中;memmove函数是用于一个重叠的内存中,将这个内存中的一些数据移动位置。

3.2.1 memcpy函数居然也能完成memmove函数的功能?

       为什么小编会这样说呢?因为在前言中,小编用的是自己模拟实现的memcpy函数,而用的不是库函数的memcpy函数。如果我们用的是memcpy函数呢?结果是可以实现memmove函数的功能。难道是我们写错了吗,不是,而是VS中的库函数的功能不叫强大(太卷了),现在我们来看一下memcpy函数实现功能:

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

3.2.2 函数功能

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

       这个函数的功能是从source指针指向的位置开始,拷贝num个字节的内存块到destination中,其是能够对本身进行覆盖拷贝的函数,其又同时兼备了 memcpy函数可做的事。 

3.2.3 模拟实现一下memmove内存函数

void* my_memmove(void* dest, const void* src, size_t num)
{
    assert(dest && src)
    void* ret = dest;
	if ((char*)dest < (char*)src)
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
    return ret;
}

3.3 memset函数

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

       memset函数是用来设置内存的,以字节为单位进行设置内存(更适合字符数组)。但要注意这个memset函数的使用场景,因为场景不同,这个memset函数所实现的功能是不同的。

第一个场景:

       如果有一个数组arr,其内容是全为0,如果我们想让其的内容变为1,我们应该怎么办呢?我们如果使用memset函数,其结果又是什么呢?

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

       为什么会是这个样子呢?因为memset函数是一个字节一个字节地进行设置,会将每一个字节的内容都设置为1,所以四个字节的数字的值不会是1,。

第二个场景:

       如果我们想使数组的内容全初始化为0,我们可不可以使用memset函数呢?答案是可以的,因为即使每一个字节的内容都为0,那么四个字节的内容还是会等于0的。

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

3.4 memcmp内存函数

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数

       这个函数的功能是比较两个内存块对应字节内容的大小,不过,这个函数一个字节一个字节地比较,所以会有一些不同常理的事情发生:

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数,C语言笔记——初阶and进阶,c语言,memcpy函数,memmove函数,memset函数,memcmp函数,字符分类函数,字符转换函数文章来源地址https://www.toymoban.com/news/detail-714972.html


学习产出:

  1. 字符分类函数
  2. 字符转换函数
  3. 内存函数 

到了这里,关于【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【再识C进阶4】详细介绍自定义类型——结构体、枚举和联合

           在上一篇博客中,我们已经详细地学习了字符分类函数、字符转换函数和内存函数。那这一篇博客和上一篇博客的关系不是那么相连。        这一篇博客主要介绍一下 自定义类型 ,因为在解决实际问题时, 由于世界上的因素有很多,我们需要建立不同的数据

    2024年02月08日
    浏览(49)
  • 【再识C进阶5(上)】详细介绍C语言文件操作——文件是用于存储数据

    💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖        在上一篇博客中,我们学习了一些 自定义类型

    2024年02月08日
    浏览(37)
  • 【C语言】字符函数与字符串函数以及内存函数 { 超详细攻略,一篇学会 }

    今日分享:字符、字符串函数和内存函数 内存函数 就是对内存进行操作的函数 字符串函数 就是对字符串进行操作的函数 字符函数 就是对字符进行操作的函数 str 前缀的函数是字符串函数,头文件string.h mem 前缀的函数是内存函数,头文件stdlib.h 字符分类函数包含在 ctype.h 头

    2024年03月18日
    浏览(60)
  • 【Java基础教程】(四十五)IO篇 · 中:转换流、内存流和打印流(探索装饰设计模式与PrintStream类的进阶),文件操作案例实践、字符编码问题~

    掌握内存操作流、转换流、打印流的使用; 掌握文件复制操作; 掌握字符的主要编码类型以及乱码问题产生的原因; 虽然字节流与字符流表示两种不同的数据流操作,但是这两种流彼此间是可以实现互相转换的,而要实现这样的转换可以通过 InputStreamReader 、 OutputStreamWrit

    2024年02月16日
    浏览(37)
  • c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))

    上篇文章介绍了一些常用的字符串函数,大家可以跳转过去浏览一下:c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(上))_总之就是非常唔姆的博客-CSDN博客 今天接着来介绍一些:  目录 一.字符串查找 1.strstr() 1.1示例 1.2注意事项: 1.3模拟实现  2.

    2024年02月07日
    浏览(45)
  • 进阶C语言——再识结构体

    1 结构的基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 2 结构的声明 如果下面来描述一个学生的话,我们会想到学生的姓名,成绩,性别等,那我们就可以用结构体来创建这样的一个变量包含这些内容。 3 特殊的声明 在声明

    2024年02月14日
    浏览(30)
  • 【C语言】字符函数,字符串函数,内存函数

    大家好!今天我们来学习C语言中的字符函数,字符串函数和内存函数。 目录 1. 字符函数 1.1 字符分类函数 1.2 字符转换函数 1.2.1 tolower(将大写字母转化为小写字母) 1.2.2 toupper(将小写字母转化为大写字母) 2. 字符串函数 2.1 字符串输入函数 2.1.1 gets() ​2.1.2 fgets() 2.2 字符串

    2024年02月10日
    浏览(60)
  • 进阶C语言-字符函数和字符串函数

    ✅注意事项: 字符串以 \\\'\\0\\\' 作为结束标志, strlen函数 返回的是在字符串中 \\\'\\0\\\' 前面出现的字符个数(不包括 \\\'\\0\\\' ) 参数指向的字符串必须以 \\\'\\0\\\' 结束 注意函数的返回值是 size_t ,是无符号的 ✅运行示例: 🔭1.1.1strlen函数的模拟实现 📖1.计数器法 assert函数 的 作用 是断言,

    2024年02月04日
    浏览(50)
  • 字符串函数+内存函数(详解)

    本期带大家一起来学习字符串函数+内存函数😀 😃 😄 1. 求字符串长度 strlen🚀🚀 字符串 已经 ‘\\0’ 作为结束标志 ,strlen函数返回的是在字符串中 ‘\\0’ 前面出现的字符个数(不包含 ‘\\0’ )。 strlen在库里面的参数是如此的 ⌛️⌛️ 接下来我们来模拟实现strlen ,接下来

    2023年04月17日
    浏览(43)
  • C进阶:内存操作函数

    头文件:string.h 基本用途:进行不相关(不重叠的内存)拷贝。 函数原型:void* memcpy(void* destination,//指向目标数据的指针                                             const void* source,//指向被拷贝数据的指针                                             size_t num);//拷

    2024年02月16日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包