自定义实现字符串函数

C语言库函数中strlen、strcmp、strcpy、strcat是我们非常常用的一些字符串处理函数,我们不得不了解一下内部的工作原理,有必要思考如果没有这些库函数我们该如何实现这些函数的功能。以深入的了解字符串内部的处理机制。本文就记录了一些前辈们留下的非常简练的实现。

#include <stdio.h>
#include <stdlib.h>

int myStrlen(const char* str);
char* myStrcpy(char* dest, const char* src);
int myStrcmp(const char* dest, const char* src);
void myStrcat(char* dest, char* src);

int main(int argc, char *argv[])
{
	char buf[20];
	char sz[] = "dengjia";
	int nCmp;
	int nLen;
	
	nLen = myStrlen(sz);
	printf("%d\n", nLen);

	myStrcpy(buf, sz);
	printf("%s--%s\n", buf, sz);
	
	nCmp = myStrcmp(buf, sz);
	printf("%d\n", nCmp);
	
	myStrcat(buf, sz);
	printf("%s\n", buf);
	
	system("pause");
	return 0;
}

void myStrcat(char* dest, char* src)
{
	// 先将被追加字符串的指针指到\0
	while (*dest) dest++;
	// 像strcpy一样将src追加到dest中
	while (*dest++ = *src++);
}

int myStrcmp(const char* dest, const char* src)
{
	// 循环条件每个字符都相等
	// 并且两个字符串都没有到结尾
	// 一旦以上某个条件不满足则跳出while
	while (*dest == *src && *dest != '\0' && *src != '\0')
	{
		dest++; src++;
	}
	// 此时计算最后指向的两个字符的差值,返回对应值即可
	return *dest > *src ? 1 : (*dest == *src ? 0 : -1);
}

int myStrlen(const char* str)
{
	int nLen = 0;
	// 遍历字符串每一个字符,直到遇到\0为止,每循环一次给nLen加1
	while (*str++) nLen++;
	// 返回最终结果
	return nLen;
}

char* myStrcpy(char* dest, const char* src)
{
	// 备份原指针
	char* tmp = dest;
	// 把源字符串每一个字符拷贝到目标字符串中
	// 在循环条件中使用后++可减少代码行数,并且不会出问题
	// 最后字符指针指向src的\0位置
	while (*tmp++ = *src++);
	// 返回备份的指针,这样可以重叠使用myStrcpy函数
	// 例:myStrcpy(dest, myStrcpy(d,s));
	return dest;
}

说说你的想法