ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

模拟实现字符串函数

2021-07-29 15:58:27  阅读:160  来源: 互联网

标签:src 函数 dest str2 str1 assert char 字符串 模拟


strlen

返回字符串长度,不包含 ‘\0’

size_t my_strlen(const char* str) {
	// 校验参数的合法性
		//if (str == NULL) {
		//	// 操作
		//}
	// 还有一种方法是 assert"断言"
	assert(str != NULL);// 条件成立,无事发生,否则程序崩溃
	size_t size = 0;
	while (str[size] != '\0') {
		size++;
	}
	return size;
}

strcpy

拷贝字符串,把 src 指向的字符串拷贝到 dest 数组,要求 dest 的空间足够大以包含源字符串以及 ‘\0’

char* my_strcpy(char* dest, const char* src) {
	assert(dest != NULL);
	assert(src != NULL);
	int i = 0;
	while (src[i] != '\0') {
		dest[i] = src[i];
		i++;
	}
	dest[i] = '\0';
	return dest;
}

strcat

字符串拼接,将 src 指向的内容(包含 ‘\0’ )拷贝一份追加到 dest 的末尾,dest 末尾的 ‘\0’ 被 src 的首字符覆盖;另外要求 dest 指向的内存空间要足够大,dest 和 src 不能重叠

char* my_strcat(char* dest, const char* src) {
	assert(dest != NULL);
	assert(src != NULL);
	// 找到 dest 的结束位置
	int destEnd = 0;
	while (dest[destEnd] != '\0') {
		destEnd++;
	}
	// 把 src 拷贝到 dest 的末尾
	strcpy(dest + destEnd, src);
	return dest;
}

strcmp

按照字典序比较字符串str1,str2的大小。如果 str1<str2,函数返回一个负数;如果 str1=str2,函数返回0;如果 str1>str2,函数返回一个正数。

int my_strcmp(const char* str1, const char* str2) {
	assert(str1 != NULL);
	assert(str2 != NULL);
	// 依次比较每个字符之间的大小关系
	while (*str1 != '\0' && *str2 != '\0') {
		if (*str1 < *str2) {
			return -1;
		}else if (*str1 > *str2) {
			return 1;
		}else {
			//比较下一个字符
			str1++;
			str2++;
		}
	}
	// 循环结束后,有一个字符串遇到了 '\0'
	if (*str1 < *str2) {
		return -1;
	}
	else if (*str1 > *str2) {
		return 1;
	}
	else {
		return 0;
	}
}

strncpy
  • 当 num 比 src 长的时候,会在后面额外补充 ‘\0’
  • 当 num 比 src 短的时候,只拷贝 src 的前 num 个字符(不含’\0’)
  • num 的数值要保证 dest 能够容纳下含 ‘\0’ 的空间大小
char* my_strncpy(char* dest, const char* src, size_t num) {
	assert(dest != NULL);
	assert(src != NULL);
	assert(num != 0);
	size_t i = 0;
	while (src[i] != '\0' && i < num) {
		dest[i] = src[i];
		i++;
	}
	// 循环结束有两种情况
	// 1、src遇到了 \0,把 dest 剩余的部分都设为 \0
	// 2、i==num,函数结束
	while (i < num) {
		dest[i] = '\0';
		i++;
	}
	return dest;
}

strncat

拷贝 src 的前 num个字符追加到 dest,并加上 ‘\0’

char* my_strncat(char* dest, const char* src, size_t num) {
	assert(dest != NULL);
	assert(src != NULL);
	assert(num != 0);
	// 先找到 dest 的末尾
	size_t destEnd = 0;
	while (dest[destEnd] != '\0') {
		destEnd++;
	}
	size_t i = 0;
	while (src[i] != '\0' && i < num) {
		dest[destEnd + i] = src[i];
	}
	// 循环结束有两种可能
	// 1.src[i]=='\0',再追加一个\0
	// 2.i==num,再追加一个\0
	dest[destEnd + i] = '\0';
	return dest;
}

strncmp

以字典序比较 str1 和 str2 的前 num 个字符大小

int my_strncmp(const char* str1, const char* str2, size_t num) {
	assert(str1 != NULL);
	assert(str2 != NULL);
	assert(num != 0);
	size_t i = 0;
	while (str1[i] != '\0' && str2[i] != '\0' && i < num) {
		if (str1[i] < str2[i]) {
			return -1;
		}
		else if (str1[i] > str2[i]) {
			return 1;
		}
		else {
			i++;
		}
	}
	// 循环结束有三种可能
	if (i == num) {
		return 0;
	}
	if (str1[i] < str2[i]) {
		return -1;
	}
	else {
		return 1;
	}
}

strstr

判断 str2 是否为 str1 的字符串子串

const char* my_strstr(const char* str1, const char* str2) {
	assert(str1 != NULL);
	assert(str2 != NULL);
	assert(str1 != '\0');
	assert(str2 != '\0');
	const char* black = str1;
	while (*black != '\0') {
		const char* red = black;
		const char* sub = str2;
		while (*red != '\0' && *sub != '\0' && *red == *sub) {
			red++;
			sub++;
		}
		if (*red == '\0' || *red == *sub) {
			black++;
			continue;
		}
		if (*sub == '\0') {
			return black;
		}
	}
	return NULL;
}

标签:src,函数,dest,str2,str1,assert,char,字符串,模拟
来源: https://blog.csdn.net/EthanBill/article/details/119203587

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有