廊坊营销型网站建设,重庆建筑证书查询网站,建筑模板厂家大全,中山专业手机网站建设前言 #x1f493;作者简介#xff1a; 加油#xff0c;旭杏#xff0c;目前大二#xff0c;正在学习C#xff0c;数据结构等#x1f440; #x1f493;作者主页#xff1a;加油#xff0c;旭杏的主页#x1f440; ⏩本文收录在#xff1a;再识C进阶的专栏#x1…
前言 作者简介 加油旭杏目前大二正在学习C数据结构等 作者主页加油旭杏的主页 ⏩本文收录在再识C进阶的专栏 代码仓库旭日东升 1 欢迎大家点赞 收藏 ⭐ 加关注哦 学习目标 在上一篇博客中我们学习了字符串函数字符串是由字符构成的那么这篇博客将会为大家讲解字符分类函数字符转换函数以及内存函数那么字符就又有了一片新天地。这篇博客还是会很简单的废话不多说我们来开始写博客。 学习内容
通过上面的学习目标我们可以列出要学习的内容
字符分类函数字符转换函数内存函数 一、字符分类函数
先来看一下全部字符分类函数的大纲总共有12个请看下面表格 函数如果他的参数符合下列条件就返回真iscntrl任何控制字符isspace空白字符空格换页\f换行\n回车\r制表符\t或者垂直制表符\visdigit十进制数字 0~9isxdigit十六进制数字包括所有的十进制数字小写字母 a~f大写字母 A~Fislower小写字母 a~zisupper大写字母 A~Zisalpha小写字母 a~z 或大写字母 A~Zisalnum字母或者数字a~zA~Z0~9ispunct标点符号任何不属于数字或者字母的圆形字符可打印isgraph任何圆形字符isprint任何可打印的字符包括圆形字符和空白字符
1.1 iscntrl字符函数
1.1.1 控制字符的概念了解一下 在小编刚听到这个函数时我在纳闷控制字符是什么控制字符的概念简单来讲就是出现于特定的信息文本中表示某一控制功能的字符。 精确来讲就是在ASCII码中第031号及第127号(共33个)是控制字符或通讯专用字符如控制符LF换行、CR回车、FF换页、DEL删除、BS退格)、BEL振铃等通讯专用字符SOH文头、EOT文尾、ACK确认等。 1.1.2 iscntrl函数的作用 其功能就是检查字符c是否为控制字符如果是则返回真非0的数有可能是负数如果不是则返回假。
1.2 isspace字符函数 其功能是检查字符c是否为空白字符空白字符的概念在上面表格已经写的很详细了当然在图中也很清楚。
1.3 isdigit字符函数 这个函数还是用的比较多的因为其功能是检查字符c是否为十进制数字十进制数字想必大家都很清楚所以这个函数还算能用的上大家还是要重视一下。 1.4 isxdigit字符函数 这个函数的范围和上面的isdight字符函数差不多所以小编推断这个函数应该会用的很少但还是要看一下有个印象。这个函数的功能是检查字符c是否为十六进制数字包括所有的十进制数字小写字母 a~f大写字母 A~F。 1.5 islower字符函数 这个函数就有点意思功能是检查字符c是否为小写字母在一些题目中可能会用到这个函数这个函数还是要记住为好。 举个例子 题目请回答出你所你输入的字符串中小写字母的个数为多少 代码 #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;
} 1.6 isupper字符函数 有了检查是否为小写字母的函数那必然会有检查大写字母的字符函数同样我们在网站来看看这个函数吧这个用法是和上面的字符函数的用法是基本一样的这里就不在赘述。 1.7 isalpha字符函数 这个函数就是将 islower 字符函数和 isupper 字符函数结合起来其功能是将检查是否为26个英文字母。个人感觉不是很好用因为其的范围实在是太大了。 二、字符转换函数 字符转换函数一共有两个一个是 tolower 字符函数一个是 toupper 字符函数。这两个字符还是比较重要的因为在题目的求解中会用到这两个字符函数。我们需要先来了解这两个字符函数的功能之后我们再来用一个习题进行巩固练习。
2.1 tolower字符函数
2.1.1 函数功能 这个函数将判断所选的字符c是否为大写字母如果是大写字母的话将这个字符c转换为小写字母如果不是大写字母将不会转换这个字符c。大致工作原理就是利用 islower 字符函数进行判断然后将这个字符函数进行处理即可。 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 字符函数进行判断然后将这个字符函数进行处理即可。 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 呢 三、内存函数 内存函数就是内存相关的函数这些函数有4个memcpymemmovememsetmemcmp。 如果我们将这种函数和上一篇字符串函数是有点相似的但是我们已经有了字符串函数进行拷贝了为什么还要用内存函数进行拷贝呢大家要把视野放宽一下在内存中不仅仅只有字符串还有其他类型的数据需要拷贝那么我们开始进行学习吧
3.1 memcpy内存函数 3.1.1 函数功能 这个函数的功能是复制内存块将从源头指向的位置开始往后的num个字节复制到目标指向的内存块中。乍一看感觉和strcpy字符函数的功能有点像但是他们两个还是有不同请看下面的对比图 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;
} 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函数先卖个关子之后会说 所以这就引出了这一部分我们要学习的函数——memmove函数这个函数会将内存块中的数据进行移动要与memcpy函数区分接下来我们来验证一下 总结 memcpy函数是用于两个不重叠的内存中将一个内存中的数据拷贝到另一个内存当中memmove函数是用于一个重叠的内存中将这个内存中的一些数据移动位置。 3.2.1 memcpy函数居然也能完成memmove函数的功能 为什么小编会这样说呢因为在前言中小编用的是自己模拟实现的memcpy函数而用的不是库函数的memcpy函数。如果我们用的是memcpy函数呢结果是可以实现memmove函数的功能。难道是我们写错了吗不是而是VS中的库函数的功能不叫强大太卷了现在我们来看一下memcpy函数实现功能 3.2.2 函数功能 这个函数的功能是从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函数 memset函数是用来设置内存的以字节为单位进行设置内存更适合字符数组。但要注意这个memset函数的使用场景因为场景不同这个memset函数所实现的功能是不同的。 第一个场景 如果有一个数组arr,其内容是全为0如果我们想让其的内容变为1我们应该怎么办呢我们如果使用memset函数其结果又是什么呢 为什么会是这个样子呢因为memset函数是一个字节一个字节地进行设置会将每一个字节的内容都设置为1所以四个字节的数字的值不会是1,。 第二个场景 如果我们想使数组的内容全初始化为0我们可不可以使用memset函数呢答案是可以的因为即使每一个字节的内容都为0那么四个字节的内容还是会等于0的。 3.4 memcmp内存函数 这个函数的功能是比较两个内存块对应字节内容的大小不过这个函数一个字节一个字节地比较所以会有一些不同常理的事情发生 学习产出
字符分类函数字符转换函数内存函数