【C语言】字符/字符串函数的概念,使用及模拟实现
时间:2024-04-28 19:35:23 来源:网络cs 作者:璐璐 栏目:其他工具 阅读:
目录
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;}
所以 strcpy 和 strcat 是有相似的, 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,作者:璐璐,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!
下一篇:返回列表