11.字符函数和字符串函数(一)

一.字符分类函数

cpp 复制代码
int main()
{
	int ch = getchar();
	if (ch >= 'A' && ch <= 'Z')
	{
		printf("大写\n");
	}
	else if (ch >= 'a' && ch <= 'z')
	{
		printf("小写\n");
	}

	return 0;
}
cpp 复制代码
#include <ctype.h>

int main()
{
	int ch = getchar();
	putchar(ch);
	if (islower(ch))
	{
		printf("小写\n");
	}
	else if (isupper(ch))
	{
		printf("大写\n");
	}

	return 0;
}
cpp 复制代码
//把一个字符串转换成全小写

int main()
{
	char arr[] = "I Am A Student";
	int i = 0;
	while (arr[i])
	{
		if (isupper(arr[i]))
		{
			arr[i] = arr[i] + 32;
		}
		putchar(arr[i]);
		i++;
	}
	return 0;
}

二.字符转换函数

cpp 复制代码
int main()
{
	char arr[] = "I Am A Student";
	int i = 0;
	while (arr[i])
	{
		if (isupper(arr[i]))
		{
			//arr[i] = arr[i] + 32;
			arr[i] = tolower(arr[i]);
		}
		putchar(arr[i]);
		i++;
	}
	return 0;
}
cpp 复制代码
int main()
{
	int ch = getchar();
	int r = toupper(ch);
	printf("%c\n", r);

	return 0;
}

三.strlen的使用和模拟实现

1.strlen的使用

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

int main()
{
	//char arr[] = "abcdef";//[a b c d e f \0]
	char arr[] = { 'a', 'b', 'c' ,'\0'};//[a b c]
	size_t len = strlen(arr);
	printf("%zd\n", len);

	return 0;
}
cpp 复制代码
int main()
{
	if (strlen("abc") - strlen("abcdef") > 0)
	{
		printf("大于\n");
	}
	else
	{
		printf("小于等于\n");
	}
	return 0;
}

strlen返回的size_t 类型,size_t是无符号整性,两个无符号整性相减还是无符号整性

cpp 复制代码
int main()
{
	//3-6=-3
	if ((int)strlen("abc") - (int)strlen("abcdef") > 0)
	{
		printf("大于\n");
	}
	else
	{
		printf("小于等于\n");
	}
	return 0;
}

2.strlen的模拟实现

cpp 复制代码
#include <assert.h>

size_t my_strlen1(const char* str)
{
	size_t count = 0;
	assert(str != NULL);
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

size_t my_strlen2(const char* str)
{
	assert(str);
	const char* start = str;
	while (*str)
	{
		str++;
	}
	return str - start;
}

//写一个函数,不能使用临时变量,求字符串长度 - 递归
size_t my_strlen(const char* str)
{
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}

//my_strlen("abcdef");
//1+my_strlen("bcdef");
//1+1+my_strlen("cdef");
//1+1+1+my_strlen("def");
//1+1+1+1+my_strlen("ef");
//1+1+1+1+1+my_strlen("f");
//1+1+1+1+1+1+my_strlen("");
//1+1+1+1+1+1+0;

int main()
{
	char arr[] = "abc";
	size_t len = my_strlen(arr);
	printf("%zd\n", len);

	return 0;
}

四.strcpy的使用和模拟实现

1.strcpy的使用

cpp 复制代码
int main()
{
	char arr1[20] = "xxxxxxxxx";
	char arr2[] = {'a', 'b', 'c','\0'};
	strcpy(arr1, arr2);
	printf("%s\n", arr1);

	return 0;
}

原字符串里面必须要有\0,否则会一直向后面进行拷贝

cpp 复制代码
int main()
{
	char arr1[5] = {0};//目标空间必须足够大
	char arr2[] = "hello world";
	strcpy(arr1, arr2);
	printf("%s\n", arr1);

	return 0;
}

目标地址必须足够大,不然会出错

cpp 复制代码
int main()
{
	char* p = "abcdefghilmkqwer";//常量字符串,不能修改
	char arr2[] = "hello world";
	strcpy(p, arr2);//目标空间必须是可修改的
	printf("%s\n", p);

	return 0;
}

2.strcpy的模拟实现

cpp 复制代码
//模拟实现strcpy函数

void my_strcpy(char* dest, char* src)
{
	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;
}

char* my_strcpy(char* dest, char* src)
{
	/*assert(dest != NULL);
	assert(src != NULL);*/
	char* ret = dest;
	assert(dest && src);
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "abcdef";
	printf("%s\n", my_strcpy(arr1, arr2));

	return 0;
}

这个地方的*src++,是先算的++,但是是后置++,所以还是返回的src进行解引用

五.strcat的使用和模拟实现

cpp 复制代码
char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest && src);
	//1. 找到目标空间的\0
	while (*dest)
	{
		dest++;
	}
	//2. 拷贝
	while (*dest++ = *src++)
	{
		;
	}

	return ret;
}


int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";
    strcat(arr1,arr2);
	my_strcat(arr1, arr2);
	printf("%s\n", arr1);

	return 0;
}
cpp 复制代码
char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest && src);
	//1. 找到目标空间的\0
	while (*dest)
	{
		dest++;
	}
	//2. 拷贝  
	while (*dest++ = *src++)
	{
		;
	}

	return ret;
}

int main()
{
	char arr1[20] = "hello ";
	my_strcat(arr1, arr1);
	printf("%s\n", arr1);

	return 0;
}

库里面可以,但是还是最好不要自己给自己进行追加

六.strcmp的使用和模拟实现

1.strcmp的使用

cpp 复制代码
int main()
{
	int ret = strcmp("bbq", "abcdef");
	printf("%d\n", ret);

	return 0;
}
cpp 复制代码
int main()
{
	int ret = strcmp("bbq", "abcdef");
	if (ret > 0)
		printf("大于\n");
	else if (ret == 0)
		printf("等于\n");
	else
		printf("小于\n");

	return 0;
}

2.strcmp的模拟实现

cpp 复制代码
int my_strcmp(const char* s1, const char* s2)
{
	while (*s1 == *s2)
	{
		if (*s1 == '\0')
			return 0;
		s1++;
		s2++;
	}
	if (*s1 > *s2)
		return 1;
	else
		return -1;
}

int my_strcmp(const char* s1, const char* s2)
{
	while (*s1 == *s2)
	{
		if (*s1 == '\0')
			return 0;
		s1++;
		s2++;
	}
	return *s1 - *s2;
}

int main()
{
	int ret = my_strcmp("abcdef", "abc");
	if (ret > 0)
		printf("大于\n");
	else if (ret == 0)
		printf("等于\n");
	else
		printf("小于\n");
	return 0;
}

七.strncpy的使用

cpp 复制代码
int main()
{
	char arr1[20] = "xxxxxxxxxx";
	char arr2[] = "hello";
	strncpy(arr1, arr2, 7);

	return 0;
}

八.strncat函数的使用

cpp 复制代码
int main()
{
	char arr1[20] = "hello\0xxxxxxxxxxx";
	char arr2[] = "world";
	strncat(arr1, arr2, 7);

	return 0;
}

九.strncmp函数的使用

cpp 复制代码
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcq";
	int ret = strncmp(arr1, arr2, 3);

	printf("%d\n", ret);
	return 0;
}

这就是比较前n个,但是要在有限的范围内进行比较

十.strstr的使用和模拟实现

1.strstr的使用

cpp 复制代码
//strstr 返回字符串在另外一个字符中第一次出现的位置

int main()
{
	char arr1[] = "abcdefabcdef";
	char arr2[] = "deq";
	char* ret = strstr(arr1, arr2);
	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到\n");

	return 0;
}

2.strstr的模拟实现

cpp 复制代码
char* my_strstr(const char* str1, const char*str2)
{
	const char* cur = str1;
	const char* s1 = NULL;
	const char* s2 = NULL;

	assert(str1 && str2);
	if (*str2 == '\0')
	{
		return (char*)str1;
	}

	while (*cur)
	{
		s1 = cur;
		s2 = str2;
		while (*s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)cur;
		}
		cur++;
	}
	return NULL;
}

int main()
{
	char arr1[] = "abbbcdef";
	char arr2[] = "bbq";
	char* ret = my_strstr(arr1, arr2);
	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到\n");

	return 0;
}
相关推荐
梦想很大很大3 小时前
拒绝“盲猜式”调优:在 Go Gin 项目中落地 OpenTelemetry 链路追踪
运维·后端·go
Sinclair4 小时前
内网服务器离线安装 Nginx+PHP+MySQL 的方法
运维
叶落阁主4 小时前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
CoovallyAIHub6 小时前
Moonshine:比 Whisper 快 100 倍的端侧语音识别神器,Star 6.6K!
深度学习·算法·计算机视觉
CoovallyAIHub7 小时前
速度暴涨10倍、成本暴降6倍!Mercury 2用扩散取代自回归,重新定义LLM推理速度
深度学习·算法·计算机视觉
CoovallyAIHub7 小时前
实时视觉AI智能体框架来了!Vision Agents 狂揽7K Star,延迟低至30ms,YOLO+Gemini实时联动!
算法·架构·github
CoovallyAIHub7 小时前
开源:YOLO最强对手?D-FINE目标检测与实例分割框架深度解析
人工智能·算法·github
CoovallyAIHub7 小时前
OpenClaw:从“19万星标”到“行业封杀”,这只“赛博龙虾”究竟触动了谁的神经?
算法·架构·github
刀法如飞8 小时前
程序员必须知道的核心算法思想
算法·编程开发·算法思想