C字符串处理函数的实现

C字符串处理函数的实现(Linux)
#include <stddef.h>
char * ___strtok = NULL;

char * strcpy(char * dest,const char *src)
{
	char *tmp = dest;

	while ((*dest++ = *src++) != '\0')
		/* nothing */;
		return tmp;
}

char * strncpy(char * dest,const char *src,size_t count)
{
	char *tmp = dest;

	while (count-- && (*dest++ = *src++) != '\0')
		/* nothing */;

		return tmp;
}

char * strcat(char * dest, const char * src)
{
	char *tmp = dest;

	while (*dest)
		dest++;
	while ((*dest++ = *src++) != '\0')
		;
	return tmp;
}

char * strncat(char *dest, const char *src, size_t count)
{
	char *tmp = dest;
	if (count) {
		while (*dest)
			dest++;
		while ((*dest++ = *src++)) {
			if (--count == 0)
				break;
		}
	}

	return tmp;
}
int strcmp(const char * cs,const char * ct)
{
	register signed char __res;

	while (1) {
		if ((__res = *cs - *ct++) != 0 || !*cs++)  /*is !*cs++ necessary? incase more cmp*/
			break;
	}

	return __res;
}

int strncmp(const char * cs,const char * ct,size_t count)
{
	register signed char __res = 0;

	while (count) {
		if ((__res = *cs - *ct++) != 0 || !*cs++)
			break;
		count--;
	}

	return __res;
}

char * strchr(const char * s,char c)
{
	for(; *s != c; ++s)
		if (*s == '\0')
			return NULL;
	return (char *) s;
}

size_t strlen(const char * s)
{
	const char *sc;

	for (sc = s; *sc != '\0'; ++sc)
		/* nothing */;
		return sc - s;
}

size_t strnlen(const char * s, size_t count)
{
	const char *sc;

	for (sc = s; *sc != '\0' && count--; ++sc)
		/* nothing */;
		return sc - s;
}

size_t strspn(const char *s, const char *accept)
{
	const char *p;
	const char *a;
	size_t count = 0;

	for (p = s; *p != '\0'; ++p) {
		for (a = accept; *a != '\0'; ++a) {
			if (*p == *a)
				break;
		}
		if (*a == '\0')
			return count;
		++count;
	}

	return count;
}

char * strpbrk(const char * cs,const char * ct)
{
	const char *sc1,*sc2;

	for( sc1 = cs; *sc1 != '\0'; ++sc1) {
		for( sc2 = ct; *sc2 != '\0'; ++sc2) {
			if (*sc1 == *sc2)
				return (char *) sc1;
		}
	}
	return NULL;
}

char * strtok(char * s,const char * ct)
{
	char *sbegin, *send;

	sbegin  = s ? s : ___strtok;
	if (!sbegin) {
		return NULL;
	}
	sbegin += strspn(sbegin,ct);
	if (*sbegin == '\0') {
		___strtok = NULL;
		return( NULL );
	}
	send = strpbrk( sbegin, ct);
	if (send && *send != '\0')
		*send++ = '\0';
	___strtok = send;
	return (sbegin);
}

void * memset(void * s,char c,size_t count)
{
	char *xs = (char *) s;

	while (count--)
		*xs++ = c;

	return s;
}

char * bcopy(const char * src, char * dest, int count)
{
	char *tmp = dest;

	while (count--)
		*tmp++ = *src++;

	return dest;
}
void * memcpy(void * dest,const void *src,size_t count)
{
	char *tmp = (char *) dest, *s = (char *) src;

	while (count--)
		*tmp++ = *s++;

	return dest;
}

void * memmove(void * dest,const void *src,size_t count)
{
	char *tmp, *s;

	if (dest <= src) {
		tmp = (char *) dest;
		s = (char *) src;
		while (count--)
			*tmp++ = *s++;
	}
	else {
		tmp = (char *) dest + count;
		s = (char *) src + count;
		while (count--)
			*--tmp = *--s;  /*12345678*/
	}     /*12345678*/

	return dest;
}

int memcmp(const void * cs,const void * ct,size_t count)
{
	const unsigned char *su1, *su2;
	signed char res = 0;

	for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
		if ((res = *su1 - *su2) != 0)
			break;
	return res;
}

/*
* find the first occurrence of byte 'c', or 1 past the area if none
*/
void * memscan(void * addr, unsigned char c, size_t size)
{
	unsigned char * p = (unsigned char *) addr;

	while (size) {
		if (*p == c)
			return (void *) p;
		p++;
		size--;
	}
	return (void *) p;
}

void main(void)
{
	return;
}

补充strstr
char *
strstr (const char *haystack, const char *needle)
{
	char *result = (char *)NULL;
	if ((haystack != (char *)NULL) && (needle != (char *)NULL))
	{
		register int i;
		int hl = strlen (haystack);
		int nl = strlen (needle);
		for (i = 0; i < (hl - nl); i++)
			if (strncmp (haystack + i, needle, nl) == 0)
			{
				result = haystack + i;
				break;
			}
	}
	return (result);
}
还有 加州大学的:
char *strstr(const  char *string, const  char *substring)
{  
	const char  *a,  *b;  

	b = substring;  
	if (*b == 0)   
	{  
		return  (char*)string;  
	}  
	for( ; *string != 0; string += 1)
	{
		if (*string !=  *b)   
		{  
			continue;  
		}  
		a = string;  
		while ((*a++ == *b++) && (*b != 0) );

		if (*b == 0)
		{
			return (char*) string;
		}
		b = substring;
	}
}
最后是AT&T:
extern char*
strstr(register const char* s1, register const char* s2)
{
	register int		c1;
	register int		c2;
	register const char*	t1;
	register const char*	t2;
	if (s2)
	{
		if (!*s2)
			return (char*)s1;
		c2 = *s2++;
		while (c1 = *s1++)
			if (c1 == c2)
			{
				t1 = s1;
				t2 = s2;
				do
				{
					if (!*t2)
						return (char*)s1 - 1;
				} while (*t1++ == *t2++);
			}
	}
	return 0;
}
--------------------------------------------------------------------------
http://blog.csdn.net/wzbob/archive/2006/11/10/1377600.aspx
c和汇编实现 一些基本字符串处理函数
1. 将一个字符串(src)拷贝到另一个字符串(dest),直到遇到NULL 字符后停止。
char *strcpy (char *dest, const char *src)
{
	_asm
	{
		pushf
			mov esi,src
			mov edi,dest
			cld  
l1: lodsb 
	stosb  
	test al,al 
	jne l1 
	popf
	}    
	return dest;   
}


2.拷贝源字符串count 个字节到目的字符串。
char *strncpy (char *dest, const char *src, int count)
{
	_asm{
		pushf
			mov esi,src
			mov edi,dest
			mov ecx,count
			cld  
l1: dec ecx 
	js l2  
	lodsb 
	stosb  
	test al,al 
	jne l1  
	rep stosb 
l2: popf
	}
	return dest;   
}

3.将源字符串拷贝到目的字符串的末尾处。
char *strcat (char *dest, const char *src)
{
	_asm {
		pushf
			mov esi,src
			mov edi,dest
			xor al,al
			mov ecx,0xffffffff
			cld  // 清方向位。
			repne scasb  
			dec edi  
l1: lodsb 
	stosb  
	test al,al 
	jne l1 
	popf
	}
	return dest;   
}

4.将源字符串的count 个字节复制到目的字符串的末尾处,最后添一空字符。
char *strncat (char *dest, const char *src, int count)
{
	_asm {
		pushf
			mov esi,src
			mov edi,dest
			xor al,al
			mov ecx,0xffffffff
			cld  
			repne scasb 
			dec edi 
			mov ecx,count 
l1: dec ecx
	js l2 
	lodsb  
	stosb 
	test al,al 
	jne l1  
l2: xor al,al 
	stosb  
	popf
	}
	return dest;  
}

5. 将一个字符串与另一个字符串进行比较。
int strcmp (const char *csrc, const char *ct)
{
	_asm{
		pushf
			mov edi,csrc
			mov esi,ct
			cld  
l1: lodsb 
	scasb  
	jne l2 
	test al,al 
	jne l1  
	xor eax,eax 
	jmp l3 
l2: mov eax,1 
	jl l3  
	neg eax 
l3: popf
	}
}

------------------------------------------------------------------------------------
1. strlen(),计算字符串长度 
int strlen(const char string) 
{ 
	int i=0; 
	while(string[i]) i++; 
	return i; 
} 
2. strcpy(), 字符串拷贝. 
char *strcpy(char *destination, const char *source) 
{ 
	while(*destinaton++=*source++); 
	return (destination-1); 
} 
3. strcat(), 字符串的连接. 
char *strcat(char *target,const char *source) 
{ 
	char *original=target; 
	while(*target) target++; // Find the end of the string 
	while(*target++=*source++); 
	return(original); 
} 
4. streql(), 判断两个字符串是否相等. 
int streql(char *str1,char *str2) 
{ 
	while((*str1==*str2)&&(*str1)) 
	{ 
		str1++; 
		str2++; 
	} 
	return((*str1==NULL)&&(*str2==NULL)); 
} 
5. strchr(), 在字符串中查找某个字符. 
char *strchr(const char *string,int letter) 
{ 
	while((*string!=letter)&(*string)) 
		string++; 
	return (string); 
} 
6. chrcnt(), 计算某个字符在字符串中出现的次数. 
int chrcnt(const char *string,int letter) 
{ 
	int count=0; 
	while(*string) 
		if(*string==letter)count++; 
	return count; 
} 
7. strcmp(), 判断两个字符串是否相等. 
int strcmp(const char *str1,const char *str2) 
{ 
	while((*str1==*str2)&&(*str1)) 
	{ 
		str1++; 
		str2++; 
	} 
	if((*str1==*str2)&&(!*str1)) //Same strings 
		return o; 
	else if((*str1)&&(!*str2)) //Same but str1 longer 
		return -1; 
	else if((*str2)&&(!*str1)) //Same but str2 longer 
	else 
	return((*str1>*str2)?-1:1); 
}
 

你可能感兴趣的:(C++,c,linux,C#,Blog)