文章目录
- 1. 字符分类函数
- 1.1 库函数iscntrl
- 1.2 库函数isspace
- 1.3 库函数islower和isupper
- 2. 字符转换函数
- 3. strlen函数的使用和模拟实现
- 3.1 strlen函数的使用
- 3.2 strlen函数的模拟实现
- 4. strcpy函数的使用和模拟实现
- 4.1 strcpy函数的使用
- 4.2 strcpy函数的模拟实现
- 5. strcat函数的使用和模拟实现
- 5.1 strcat函数的使用
- 5.2 strcat函数的模拟实现
- 6. strcmp函数的使用和实现
- 6.1 strcmp函数的使用
- 6.2 strcmp函数的模拟实现
- 7. strncpy函数的使用
- 8. strncat函数的使用
- 9. strncmp函数的使用
1. 字符分类函数
以下这些分类函数的头文件是ctype.h
函数 | 如果函数参数符合下列条件则返回true |
---|---|
iscntrl | 任何控制字符 |
isspace | 空白字符‘ ’、换页‘\f’、换行’\n’、回车‘\r’、制表符’\t’、垂直制表符’\v’ |
isdigit | 十进制数字0~9字符 |
isxdigit | 十六进制数字,包括所有十进制数字字符,小写字母a~f,大写字母A~F |
islower | 小写字母a~z |
isupper | 大写字母 |
isalpha | 字母a~z或A~Z |
isalnum | 字母或者数字,a~z,A~Z,0~9 |
ispunct | 标点符号,任何不属于数字或字母的图形字符(可打印) |
isgraph | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符和空白字符 |
1.1 库函数iscntrl
1.2 库函数isspace
1.3 库函数islower和isupper
- int islower( int c) 用来判断c是否为小写字母,是就返回大于0的数,即true,否则返回0(flase)
- int isupper( int c) 用来判断c是否为大写字母,是就返回大于0的数,即true,否则返回0(flase)
- 大小写字母转换
- 上述代码全是小写字母,从而可以利用大小写字母之间的差值32进行转换
- 如果字符串既有大写又有小写呢?
2. 字符转换函数
- int tolower( int c );将参数传进去的大写字母转换为小写
- int toupper( int c );将参数传进去的小写字母转换为大写
3. strlen函数的使用和模拟实现
3.1 strlen函数的使用
size_t strlen ( const char* str)
- strlen函数计算的是字符串中’\0’之前的字符个数,不包含’\0’
- strlen函数的返回类型是size_t,无符号整型
- 传给strlen的参数指向的字符串必须以’\0’结尾
- strlen是从传过来的参数地址开始计数,直到遇到’\0’结束
3.2 strlen函数的模拟实现
//strlen函数的模拟实现
//方法1:计数器
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* p)
{
int count = 0;
assert(p != NULL);
while (*p != '\0')
{
count++;
p++;
}
return count;
}
int main()
{
const char* str = "abcde";
size_t sum = my_strlen(str);
printf("%zd\n", sum);
return 0;
}
//方法2:指针-指针
//用指向起始位置地址的指针-指向‘\0’地址的指针
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* p)
{
char* s = p;
assert(p);
assert(s);
while (*p)
{
p++;
}
return p - s;
}
int main()
{
const char* str = "abcde";
size_t sum = my_strlen(str);
printf("%zd\n", sum);
return 0;
}
//方法3:函数递归
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* s)
{
assert(s);
if (*s == '\0')
return 0;
else
return 1 + my_strlen(s + 1);
}
int main()
{
const char* str = "abcde";
size_t sum = my_strlen(str);
printf("%zd\n", sum);
return 0;
}
关于第三种函数递归的方式实现strlen函数,可参考函数递归
4. strcpy函数的使用和模拟实现
4.1 strcpy函数的使用
- 我们如果想将一个数组里的字符串复制到另一个数组里,下面这个代码可行吗?
#include <stdio.h>
int main()
{
char arr1[]="abcdef";
char arr2[30]={0};
arr2 = arr1;
printf("%s\n",arr2);
return 0;
}
那么我问如何把arr1里面的字符串复制到arr2里呢?
C语言定义了一个专门用来字符串复制的函数:strcpy函数
char* strcpy ( char* destination, const char* source );
- | | |
- |
目标空间
源头
返回的是目标空间起始地址
- strcpy函数就是将源头字符串复制到目标空间里去,同时也会把源头字符串末尾的’\0’复制过去
- strcpy函数使用时,源字符串必须以’\0’结尾
- 目标空间必须足够大,确保能存放源字符串
- 目标空间必须可修改
4.2 strcpy函数的模拟实现
5. strcat函数的使用和模拟实现
5.1 strcat函数的使用
char* strcat ( char* destination, const char* source );
- | | |
- |
目标空间
源头
返回的是目标空间起始地址
- strcat函数是用来将源头字符串追加到目标字符串后面
- strcat函数使用时,源字符串也必须以’\0’结尾
- 目标空间必须足够大,能够容纳追加后的字符串
- 目标空间必须可修改
5.2 strcat函数的模拟实现
6. strcmp函数的使用和实现
6.1 strcmp函数的使用
6.2 strcmp函数的模拟实现
//模拟实现strcmp函数
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
while (*str1 != '\0')
{
if (*str1 < *str2)
return -1;
else if (*str1 > *str2)
return 1;
else
{
str1++;
str2++;
}
}
if (*str1 == *str2)
return 0;
}
int main()
{
char arr1[] = "aabcdef";
char arr2[] = "aabcdefg";
if (my_strcmp(arr1, arr2) > 0)
{
printf(">\n");
}
else if (strcmp(arr1, arr2) < 0)
{
printf("<\n");
}
else
printf("=\n");
return 0;
}