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;
}
相关推荐
Ayanami_Reii36 分钟前
进阶数据结构-线段树
数据结构·算法·线段树
hmbbcsm37 分钟前
练习python题目小记(七)
开发语言·python
honsor38 分钟前
一种采用POE供电的RJ45网络型温湿度传感器
运维·服务器·网络
aini_lovee38 分钟前
基于UERD算法的JPEG图像隐写MATLAB实现
开发语言·算法·matlab
!chen40 分钟前
SQL Server 2025 新功能概览
数据结构
Geek__199244 分钟前
STM32F103 ADC DMA采样与均值滤波处理实战指南
c语言·stm32
零匠学堂20251 小时前
woapi-server为Office Online Server文档在线预览提供文档加载地址
java·运维·服务器·oos·wopi
Tandy12356_1 小时前
手写TCP/IP协议栈——数据包结构定义
c语言·网络·c++·计算机网络
繁华似锦respect1 小时前
HTTPS 中 TLS 协议详细过程 + 数字证书/签名深度解析
开发语言·c++·网络协议·http·单例模式·设计模式·https