常用字符串操作(翻转、复制、比较等)

1,字符串翻转
实现逻辑,就是将字符串从中间一分为二,互相换位置即完成了翻转的效果

void rechange_str(char *str)
	{
		int i, len;
		char tmp;
		if (NULL == str) {
			return ;
		}
		len = strlen(str);
		for (i = 0; i < len/2; i ++) {
			tmp = str[i];
			str[i] = str[len-i-1];
			str[len-i-1] = tmp;
		}
	}

2,整型转字符串
实现逻辑,每个整数看其转换进制,从个位到十位百位都可以通过%操作加上/操作获得,再用一个字符数组保存0-F,用个位数对应值转为字符,
注意转换出的字符串是反向的,还要考虑传入的若是负数如何处理,再用翻转字符串完成最后整个操作

char *sky_itoa(int value, char *str, unsigned int radix)
	{
		char list[] = "0123456789ABCDEF";
		unsigned int tmp_value;
		int i, j, k;
		if (NULL == str) {
			return NULL;
		}
		if (2 != radix && 8 != radix && 10 != radix && 16 != radix) {
			return NULL;
		}
		i = 0;
		k = 0;
		if (radix == 10 && value < 0) {
			tmp_value = (unsigned int)(0 - value);
			str[i++] = '-';
			k = 1;
		} else {
			tmp_value = (unsigned int)value;
		}
		do {
			str[i++] = list[tmp_value%radix];
			tmp_value /= radix;
		} while(tmp_value);
		str[i] = '\0';
		//翻转
		char tmp;
		for (j = k; j < (i+k)/2; j++) {
			tmp = str[j];
			str[j] = str[i+k-j-1];
			str[i+k-j-1] = tmp;
		}
		return str;
	}

3,字符串复制
实现逻辑,逐个赋值直到遇到’\0’停止即可

char *sky_strcpy(char *dst, const char *str)
	{
		if (NULL == dst ||  NULL == str) {
			return NULL;
		}
		char *ret = dst;
		while (*str != '\0') {
			*dst ++ = *str ++;
		}
		return ret;	
	}	

4,字符串比较
1)正常比较是否相同
实现逻辑,判断字符串长度是否相同,若相同逐个比较字符是否相同

int sky_strcmp(char *dst, char *str)
		{
			int i, len;
			if (NULL == dst || NULL == str) {
				return 0;
			}
			if (strlen(dst) != strlen(str)) {
				return 0;
			}
			len = strlen(dst);
			for (i = 0; i < len; i++) {
				if (*dst++ != *str++) {
					return 0;
				}
			}
			return 1;
		}

2)忽略大小写字符串比较
实现逻辑,在比较字符时可以将其统一转换为大写或小写,然后再进行比对即可,和正常对比无其他不同

#define CONVERT(c) (((c) >= 'A' && (c) <= 'Z') ? ((c) - 'A' + 'a') : (c))
		int sky_strcmp(char *dst, char *str)
		{
			int i, len;
			if (NULL == dst || NULL == str) {
				return 0;
			}
			if (strlen(dst) != strlen(str)) {
				return 0;
			}
			len = strlen(dst);
			for (i = 0; i < len; i++) {
				if (CONVERT(*dst) != CONVERT(*str)) {
					return 0;
				}
				dst ++;
				str ++;
			}
			return 1;
		}

5,memcpy函数实现
实现逻辑,主要就是逐个赋值即可完成
1)不考虑拷贝覆盖问题

void *sky_memecpy(void *dst, const void *str, int n)
	{
		if (NULL == dst || NULL == str || n <= 0) {
			return NULL;
		}
		char *pdst = (char *)dst;
		char *pstr = (char *)str;
		while (n --) {
			*pdst ++ = *pstr ++;
		}
		return dst;
	}

2)考虑拷贝覆盖问题

void *sky_memecpy(void *dst, const void *str, int n)
	{
		if (NULL == dst || NULL == str || n <= 0) {
			return NULL;
		}
		char *pdst = (char *)dst;
		char *pstr = (char *)str;
			
		if (pdst > pstr && pdst < pstr + n) {
			pdst = pdst + n - 1;
			pstr = pstr + n - 1;
			while (n --) {
				*pdst -- = *pstr --;
			}
		} else {
			while (n --) {
				*pdst ++ = *pstr ++;
			}
		}
		return dst;
	}
发布了131 篇原创文章 · 获赞 44 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_38769551/article/details/104986448