文章目录
- 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;
}

7. strncpy函数的使用



8. strncat函数的使用



9. strncmp函数的使用


























