模拟实现字符串函数

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;
}

上一篇:165-Linux的多线程(中)


下一篇:替换文本文件内容