目录
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 a
return 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. 饥渴求知,虚怀若愚。
感谢各位读者支持,虚心请教,如有错漏或可改进点,请任意指出,感激不尽!
一起进步!