Self-realization - string.h FUNCTION

length

strlen()
strnlen_s()

int my_strlen(char * str) {
	if(!str) {
		return 0;
	}
	int i = 0;
	while(*str++) {
		i++;
	}
	return i;
}
int my_strnlen_s(char * str, int maxSize) {
	if(!str) {
		return 0;
	}
	int i = 0;
	while(*str++ && i++ < maxSize) {
	}
	return i;
}

copy

strcpy()
strcpy_s()
strncpy_s()

int my_strcpy(char * dest, char * src) {
	while(*src) {
		*dest++ = *src++;
	}
	*dest = '\0';
	return 0;
}
int my_strcpy_s(char * dest, int dest_len, char * src) {
	int i = 0;
	while(*src && i++ < dest_len) {
		*dest++ = *src++;
	}
	*dest = '\0';
	return 0;
}
int my_strncpy_s(char * dest, int dest_len, char * src, int max) {
	int i = 0;
	while(*src && i < dest_len && i++ < max) {
		*dest++ = *src++;
	}
	*dest = '\0';
	return 0;
}

connection

strcat_s()
strncat_s()

int my_strcat_s(char * dest, int dest_len, char * src) {
	// 跳过已有字符
	while(*dest) {
		dest++;
	}
	// 开始复制至src结束 或 到达长度
	int i=0;
	while(*src && i++ < dest_len) {
		*dest++ = *src++;
	}
	*dest = '\0';
	if(!*src) {
		// src未完全复制
		return 1;
	}
	return 0;
}
int my_strncat_s(char * dest, int dest_len, char * src, int max) {
	// 跳过已有字符
	while(*dest) {
		dest++;
	}
	// 开始复制至src结束 或 到达长度
	int i=0;
	while(*src && i < dest_len && i++ < max) {
		*dest++ = *src++;
	}
	*dest = '\0';
	if(!*src) {
		return 1;
	}
	return 0;
}

Compare

No optional function
strcmp ()
strncmp ()

int my_strcmp(char * str1, char * str2) {
	// 跳过相同部分
	while(*str1 && *str2 && *(str1++) == *(str2++)) {
	}
	// str1是否到结尾
	// 是 str2是否到结尾
	//		是 相等 0
	//		否 str2大 -1
	// 否 str2是否到结尾
	//		是 str1大 1
	//		否 比较 -1或1
	return !*str1?
		!*str2?
			0:
			-1:
		!*str2?
			1:
			*(--str1)<*(--str2)?-1:1;
}
int my_strncmp(char * str1, char * str2, int max) {
	int i = 0;
	// 跳过指定范围的相同部分
	while(*str1 && *str2 && *(str1++) == *(str2++) && i++<max) {
	}
	return !*str1?
		!*str2?
			0:
			-1:
		!*str2?
			1:
			*(--str1)<*(--str2)?-1:1;
}

search for

strchr()
strrchr()
strstr()

char * my_strchr(char * str, int ch) {
	do {
		if(*str == ch) {
			return str;
		}
	} while(*++str);
	return NULL;
}
char * my_strrchr(char * str, int ch) {
	// C不能从后先前 只能全部循环直到字符串结束 返回最后一个指针 未找到为NULL
	char * p = NULL;
	do {
		if(*str == ch) {
			p = str;
		}
	} while(*++str);
	return p;
}
char * my_strstr(char * str, char * sub) {
	// 完全循环匹配
	do {
		char * pStr = str;
		char * pSub = sub;
		while(*pStr && *pSub && *pStr == *pSub) {
			pStr++;
			pSub++;
		}
		if(!*pSub) {
			return str;
		}
	} while(*++str);
	// KMP
	return NULL;
}

Unitization

strtok()
strtok_s()

char * my_strtok(char * str, char * delimiter) {
	char * start_str = str;
	char * start_delimiter = delimiter;
	do {
		delimiter = start_delimiter;
		do {
			if(*str == *delimiter) {
				*str = '\0';
				return start_str;
			}
		} while(*++delimiter);
	} while(*++str);
	return NULL;
}

char * my_strtok_s(char * str, char * delimiter, char ** p) {
	// 非首次使用检测
	if(!str && !(str = *p)) {
		return NULL;
	}
	char * start_str = str;
	char * start_delimiter = delimiter;
	do {
		delimiter = start_delimiter;
		do {
			if(*str == *delimiter) {
				*str = '\0';
				*p = ++str;
				return start_str;
			}
		} while(*++delimiter);
	} while(*++str);
	*p = NULL;
	return start_str;
}
Published 19 original articles · won praise 1 · views 568

Guess you like

Origin blog.csdn.net/yuanshou1/article/details/104877541