跨境派

跨境派

跨境派,专注跨境行业新闻资讯、跨境电商知识分享!

当前位置:首页 > 工具系统 > 其他工具 > 【C语言】字符/字符串函数的概念,使用及模拟实现

【C语言】字符/字符串函数的概念,使用及模拟实现

时间:2024-04-28 19:35:23 来源:网络cs 作者:璐璐 栏目:其他工具 阅读:

标签: 模拟  实现  使用  函数  语言  概念 
Tiny Spark get dazzling some day.

目录

1.字符函数1.1 字符分类函数1.2 字符转换函数 2. 字符串函数2.1 strlen2.2 strcpy2.3 strcat2.4 strcmp2.5 strncpy2.6 strncat2.7 strncmp

1.字符函数

1.1 字符分类函数

字符分类函数,通常用来判断 目标字符 是什么类型 的字符。
如果字符不是该类型,返回 假(0);字符是该类型, 返回 真(非0值)
在使用 该类函数前需要包含头文件:<ctype.h>

函数函数返回 真 的参数条件范围
iscntrl任何控制字符
isspace空白字符,如空格,换页 ‘\f’,换行 ’\n’,回车 ‘\r’ 和 制表符 ‘\t’
isdigit十进制数字 0 ~ 9
isxdigit十六进制数字,包括十进制数字0 ~ 9,小写字母 a ~ f,大写字母A ~ F
islower小写字母 a ~ z
isupper大写字母 A ~ Z
isalpha英文字母 a ~ z,A ~ Z
isalnum数字 0 ~ 9 或 字母 a ~ z, A ~ Z
ispunct标点符号, 任何不属于 数字 或 字母 的可打印图形字符
isgraph任何图形字符
isprint能打印的字符都可以,包括 空白字符 和 图形字符

1.2 字符转换函数

C语言提供了 2 个字符转换参数:

int tolower ( int c ); // 将参数传进去的 大写字母 转 ⼩写 int toupper ( int c ); // 将参数传进去的 小写字母 转 ⼤写这里 参数c 的变量类型为 int,是指 c 是要 转换/强制转换 为 int 或 EOF 的字符。

同样的他们也需要包含头文件:<ctype.h>
所以,在需要将一个英文字母 从 大写(小写)转为 小写(大写)时,除了让字符 +(-)32 方法外,
也可以使用 tolower(toupper)函数

#include <stdio.h>#include <ctype.h>int main(){char ch = 'A';printf("%c %c", ch, tolower(ch));// 结果就是 A areturn 0;}

2. 字符串函数

接下来为字符串函数,用于处理字符串的计算,复制等,需要包含头文件<string.h>

2.1 strlen

函数原型:
size_t strlen ( const char* str );

strlen 用来计算字符串长度的函数,它以 ’ \0 ’ 为结束标志,返回结束之前出现的字符个数,
但它计算的时候不会将 ’ \0 ’ 算进来。

注意! 它的 返回类型 是 size_t , 是 无符号整型 ,在用占位符时要用 %zd

函数使用:
char str[] = "ShowTime!";printf("%zd", strlen(str));// 结果就是 8个字母 + 1个感叹号 == 9
我们用 指针 的方式来模拟一下 strlen 函数:
int Sim_strlen(char* s){ assert(str); char* p = s;while(*p != '\0')// 当指针 p 走到 '\0'的时候停下 p++; return p - s;// |指针-指针| = 他们之间的元素数目}

2.2 strcpy

函数原型:
char* strcpy( char* destination, const char* source );                  目标空间             源字符串

strcpy 用来将一个字符串()的内容 拷贝到 另一个空间(目标)上。

规则:
1.在源字符串中 必须 以 ’ \0 ’ 为结束,再拷贝的时候也会把这个 ’ \0 ’ 拷贝过去。
2.目标空间必须 足够大(够放源字符串就行,注意有 ’ \0 ’ 要多算一个)而且空间 可以修改

函数使用:
char dest[10] = "";char src[10] = "ShowTime!";// 这里源字符串也可以写为常量的 char* src = "ShowTime!";strcpy(dest, src);// 此时 dest 的内容就是 "ShowTime!"
函数的模拟实现:
char* Sim_strcpy(char* dest, const char* src){ char *ret = dest;assert(dest != NULL);assert(src != NULL);// 先检验 dest 和 src 是否为空指针while((*dest++ = *src++))// 拷贝值的同时又在下次 指向下一个字符(空间)的地址{;}return ret;}

2.3 strcat

函数原型:
char* strcat ( char* destination, const char* source );                   目标空间             源字符串

strcat 用来将一个字符串()的内容 接在 另一个空间(目标)字符串内容的后面。

规则:

源字符串 必须 以 ’ \0 ’ 结束。目标字符串中也 必须 有 ’ \0 ',函数哥们它至少得知道从哪开始吧。目标空间必须足够大(能容纳 源字符串的内容+目标字符串的内容),而且空间 可以修改
函数使用:
char dest[12] = "Whatcan";// 这里要注意目标空间要留有足够剩余空间放源字符串的数据char src[] = "Isay";strcat(dest, src);// 此时 dest 的内容就是 "WhatcanIsay" 没有 out 不好意思
函数的模拟实现:
char* Sim_strcat(char* dest, const char* src) {char* ret = dest; assert(dest != NULL); assert(src != NULL); // 先检验 dest 和 src 是否为空指针while(*dest) { dest++; }// 先让指针指向目标字符串的'\0'结束位置,作为函数的起始位 while((*dest++ = *src++))// 拷贝值的同时又在下次 指向下一个字符(空间)的地址(跟strcpy一样) { ; } return ret;}

所以 strcpystrcat 是有相似的, strcpy 更多的是字符串往 全空的空间 拷贝过去, 而 strcat 则是在 原有的基础上,往原有内容后 空的空间拷贝过去。

2.4 strcmp

函数原型:
int strcmp ( const char* str1, const char* str2 );

strcmp函数用于比较两个字符串的大小。

注意 !该函数比较的不是字符串的 长度 !而是比较字符串第一个 相同位置 的不同字符所对应的 ASCII码值的大小
规则:

第一个字符串 大于 第二个字符串,则返回值 大于0第一个字符串 等于 第二个字符串,则返回值 等于0第一个字符串 小于 第二个字符串,则返回值 小于0
函数使用:
char* str1 = "ABCDE";char* str2 = "ABCDF";int res = strcmp(str1, str2);// res == -1

首先,str1 和 str2 的前四个字符ABCD相同,只需比较 E 和 F ,对应的 ASCII 码表值 E 比 F 小。 所以, 函数返回值 小于0, res == -1 < 0。

函数的模拟实现
int Sim_strcmp (const char* str1, const char* str2){ assert(str1 != NULL); assert(str2 != NULL); //先检验 str1 和 str2 是否为空指针 while(*str1 == *str2) { if(*str1 == '\0') return 0; str1++; str2++; } return *str1 - *str2; }

2.5 strncpy

-函数原型:

char* strncpy ( char* destination, const char* source, size_t num );目标空间             源字符串         拷贝数目

跟函数 strcpy 作用类似,strncpy 也用来将一个字符串()的内容 拷贝到 另一个空间(目标)上,但是多规定了拷贝数目。

规则:

拷贝 num 个字符串从源字符串到目字符串标空间。如果源字符串的长度 小于num,则拷贝完字符串之后,在目标的后面追加 0,直到 num 个。strncpy 不会将 ’ \0 ’ 复制过去
函数使用
char dest[10] = "";char src[10] = "HElloWorld";int num = 5;strncpy(dest, src, num);// 此时 dest 的内容就是 "Hello", 后面的 "World" 不会复制过来
函数的模拟实现
char* Sim_strncpy(char* dest, const char* src, size_t num){char* ret = dest;assert(dest != NULL);assert(src != NULL);while (num--){*dest = *src;dest++;src++;}return ret;}

2.6 strncat

函数原型:
char* strncat ( char* destination, const char* source, size_t num );    目标空间             源字符串         拷贝数目

跟函数 strcat 作用类似,strncat 也将一个字符串()的内容 接在 另一个空间(目标)字符串内容的后面,但是多规定了拷贝数目。

规则:

将源字符串的前 num 个字符追加到 目标空间 的字符串末尾,再追加⼀个 ‘\0’ 字符。如果源字符串的长度 小于num 的时候,只会将字符串中到 ’ \0 * 的内容追加到 目标空间的字符串末尾。
函数使用:
char dest[40] = "This book belongs to the "; // 这里要注意目标空间要留有足够剩余空间放源字符串的数据char* src = "Half Blood Prince";int num = 4;strncat(dest, src, num);// 此时 dest 的内容就是 "This book belongs to the Half"
函数的模拟实现
char* Sim_strncat(char* dest, char* src, int num){char* ret = dest;while (*dest){dest++;}while (num--){*dest = *src;dest++;src++;}return dest;}

2.7 strncmp

函数原型:
int strncmp ( const char* str1, const char* str2, size_t num );

跟函数 strcmp 作用类似,strncmp作用比较两个函数的前 num 个字符。

再次注意 !该函数与函数 strcmp 一样,比较的不是字符串的 长度 !而是比较字符串第一个 相同位置 的不同字符所对应的 ASCII码值的大小
规则:

第一个字符串 大于 第二个字符串,则返回值 大于0第一个字符串 等于 第二个字符串,则返回值 等于0第一个字符串 小于 第二个字符串,则返回值 小于0
函数使用:
char* str1 = "ABCDX";char* str2 = "ABCDY";int num = 4;int res = strncmp(str1, str2, num);

尽管 str1 和 str2 比较 X 和 Y 不同,str2 是应该大于 str1的,可我们只比较前 4 个字符,str1 和 str2 前个字符都是相同的ABCD,所以 str1等于str2, 函数返回值为 0, res == 0。

  
  
  Stay hungry. Stay Foolish. 饥渴求知,虚怀若愚。
  感谢各位读者支持,虚心请教,如有错漏或可改进点,请任意指出,感激不尽!
  一起进步!


本文链接:https://www.kjpai.cn/news/2024-04-28/163330.html,文章来源:网络cs,作者:璐璐,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇:WebGIS 之 vue3+vite+ceisum

下一篇:返回列表

文章评论