《C语言疑难点 --- 字符函数和字符串函数专题(上)》

《C语言疑难点 --- 字符函数和字符串函数专题(上)》


🔥小龙报:个人主页

🎬作者简介:C++研发,嵌入式,机器人方向学习者

❄️个人专栏:《C语言》《算法》KelpBar海带Linux智慧屏项目

✨***永远相信美好的事情即将发生***

文章目录



一、字符分类函数

C语言中有⼀系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。

这些函数的使用都需要包含⼀个头⽂件是:<ctype.h>

这些函数的使用方法非常类似,我们通过讲解⼀个函数其他的以此类推:

c 复制代码
int islower ( int c );

islower 是能够判断参数部分的c是否是小写字母的。

通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返回0。

例:

写⼀个代码,将字符串中的⼩写字⺟转⼤写,其他字符不变。

c 复制代码
#include <stdio.h>
#include <ctype.h>
int main()
{
	int i = 0;
	char str[] = "Test String.\n";
	char c;
	while (str[i])
	{
		c = str[i];
		if (islower(c))
			c -= 32;
		putchar(c);
		i++;
	}
	return 0;
}

运行结果:

二、字符转换函数

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

c 复制代码
(1)int tolower ( int c );    //将参数传进去的大写字母转小写     
(2)int toupper ( int c ); //将参数传进去的小写字母转大写

我们还是以一道例题来看:

例:

写⼀个代码,将字符串中的⼩写字⺟转⼤写,其他字符不变。

c 复制代码
#include <stdio.h>
#include <ctype.h>
int main()
{
	int i = 0;
	char str[] = "Test String.\n";
	char c;
	while (str[i])
	{
		c = str[i];
		if (islower(c))
			str[i] = toupper(str[i]);
		putchar(c);
		i++;
	}
	return 0;
}

运行结果:(可以看出是一样)

三、strlen的使用和模拟实现

3.1 strlen函数的解析和使用与注意

c 复制代码
size_t strlen ( const char * str );

(1)功能:

(1)统计参数str指向的字符串的长度,统计的是字符串中 '\0' 之前的字符的个数

(2)参数:str指针,指向了要统计长度的字符串。返回值:返回了str指向的字符串的长度,返回的长度不会是负数 ,所以返回类型是size_t。
(2)使用:

c 复制代码
#include<stdio.h>
#include<string.h>
 
int main()
{
	const char* str = "abcdef";
	printf("%zd\n", strlen(str));//6
	return 0;
}

(3)注意事项:

(1) 字符串以'\0' 作为结束标志,strlen函数返回的是在字符串中'\0' 前⾯出现的字符个数(不包'\0' )。

(2) 注意函数的返回值为size_t,是无符号的(易错)

(3)strlen的使用需要包含头文件

3.2strlen函数的模拟实现

3.2.1计数器方式

c 复制代码
#include <stdio.h>


size_t my_strlen(const char* str)
{
	size_t cnt = 0;
	
	while (*str)
	{
		cnt++; 
		str++;
	}
	return cnt;
}
int main()
{
	char str[] = "hello world!";

	int len = my_strlen(str);

	printf("%d", len);
	return 0;
}

3.2.2 递归

c 复制代码
#include <stdio.h>

size_t my_strlen(const char* str)
{
	assert(str);
	if (*str == '\0')
		return 0;
	return 1 + my_strlen(str + 1);
}
int main()
{
	char str[] = "hello world!";

	int len = my_strlen(str);

	printf("%d", len);
	return 0;
}

3.2.3指针减指针

c 复制代码
#include <stdio.h>
#include <assert.h>

size_t my_strlen(const char* str)
{
	assert(str);
	
	char* p = str;
	while (*p)
	{
		p++;
	}
	return p - str;
}
int main()
{
	char str[] = "hello world!";

	int len = my_strlen(str);

	printf("%d", len);
	return 0;
}

四、strcpy的使用和模拟实现

4.1 strcpy函数的解析和使用与注意

c 复制代码
char* strcpy(char * destination, const char * source );

(1)功能:

字符串拷贝,将源头的字符串拷贝到目标空间中,拷贝到源头字符串中的 '\0' 为止。

参数: destination指针,指向目的地空间;

source指针,指向源头数据。

返回值:strcpy函数返回的目标空间的起始地址
(2)使用:

c 复制代码
#include <stdio.h>
#include <string.h>
 
int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "hello";
	char*p=strcpy(arr1, arr2);
	printf("%s\n", p);
	printf("%s\n", arr1);
	//两种打印方式都可以
	return 0;
}

(3)注意:

(1)源字符串必须以'\0' 结束。

(2)会将源字符串中的'\0' 拷贝到目标空间。

(3)目标空间必须足够大,以确保能存放源字符串。

(4)目标空间必须可修改。

4.2 strcpy 函数的模拟实现

c 复制代码
#include <stdio.h>
#include <assert.h>

char* my_strcpy(char* dest, const char* source)
{
	char* temp = dest;
	assert(dest != NULL);
	assert(source != NULL);

	while (*dest++ = *source++)
	{
		;
	}
	return temp;
}
int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "hello";

	char* p = my_strcpy(arr1, arr2);
	printf("%s\n", p);
	printf("%s\n", arr1);
	//两种打印方式都可以
	return 0;
}

运行结果:

五、strcat的使用和模拟实现

5.1 strcat函数的解析和使用与注意

c 复制代码
 char *  strcat (char  *  destination, const char  *  source );

(1)功能:

功能:字符串追加,把source指针的源字符串中的所有字符都追加到destination指向的空间中

参数:destination指针,指向目的地空间;source指针,指向源头数据。

返回值:strcat函数返回的目标空间的起始地址

(2)使用:

c 复制代码
#include <stdio.h>
#include <string.h>

int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";
	char* p = strcat(arr1, arr2);
	printf("%s\n", p);
	printf("%s\n", arr1);
	//两种打印方式都可以
	return 0;
}

(3)注意:

(1) 源字符串必须以'\0' 结束。

(2)目标字符串中也得有'\0',否则没办法知道追加从哪⾥开始。

(3) 目标空间必须有足够的大,能容纳下源字符串的内容。

(4)目标空间必须可修改

5.2 strcat 函数的模拟实现

c 复制代码
#include <stdio.h>
#include <assert.h>

char* my_strcat(char* dest, const char* source)
{
	char* temp = dest;
	assert(dest != NULL && source != NULL);

	while (*dest)
		dest++;

	while (*dest++ = *source++)
	{
		;
	}
	return temp;
}

int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";
	char* p = my_strcat(arr1, arr2);
	printf("%s\n", p);
	printf("%s\n", arr1);
	//两种打印方式都可以
	return 0;
}

运行结果:

六、strcmp的使用和模拟实现

6.1 strcmp函数的解析和使用与注意

c 复制代码
int strcmp (const char * str1, const char * str2);

(1)解析:

用来比较str1和str2指向的字符串,从两个字符的第一个字符开始比较,如果两个字符的ASCLL码值相等,就比较下一个字符,直到遇到不相等的两个字符,或者字符串结束。

参数:str1指针,指针要比较的第一个字符串;str2指针,指向要比较的第二个字符串。

返回值:标准规定第一个字符串大于第二个字符串,则返回大于0的数字第一个字符串等于第二个字符串,则返回0\n第一个字符串小于第二个字符串,则返回小于0的数字

(2)使用:

c 复制代码
#include<stdio.h>
#include<string.h>
 
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcd";
	int ret=strcmp(arr1, arr2);//strcmp中直接放字符串也可以比
	if (ret > 0)
		printf("arr1 > arr2\n");
	else if (ret < 0)
		printf("arr1 < arr2\n");
	else
		printf("arr1 == arr2\n");
	return 0;
}

6.2 strcmp函数的模拟实现

c 复制代码
#include <stdio.h>
#include <assert.h>

int my_strcmp(char* arr1, char* arr2)
{
	while (*arr1 == *arr2)
	{
		if (*arr1 == '\0')
			return 0;

		arr1++;
		arr2++;
	}

	if (*arr1 > *arr2)
		return 1;
	else
		return -1;
}

int main()
{
	char arr1[20] = "abcdef";
	char arr2[] = "abcd";
	int p = my_strcmp(arr1, arr2);
	
	if (p == 0)
		printf("%d\n", p);
	else if (p > 0)
		printf("%d\n", p);
	else
		printf("%d\n",p);

	return 0;
}

运行结果:

总结 --- 每日励志时刻

相关推荐
凭君语未可2 小时前
深度解析Java的多态特性
java·开发语言
趙小贞2 小时前
字符设备驱动开发流程与实战:以 LED 驱动为例
linux·c语言·驱动开发
csbysj20202 小时前
DTD 元素:XML 与 SGML 文档结构解析指南
开发语言
傻童:CPU3 小时前
C语言练习题
c语言·开发语言
zbh06043 小时前
洛谷P5788 【模板】单调栈——单调栈
数据结构·算法
极地星光3 小时前
协程:实战与系统集成(高级篇)
开发语言
咔咔咔的3 小时前
3461. 判断操作后字符串中的数字是否相等 I
c++
0和1的舞者3 小时前
《Git:从入门到精通(八)——企业级git开发相关内容》
大数据·开发语言·git·搜索引擎·全文检索·软件工程·初学者
liulilittle3 小时前
LwIP协议栈MPA多进程架构
服务器·开发语言·网络·c++·架构·lwip·通信