`

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++

    用于 C 的字符串处理函数集源代码.rar

    一些C 专用的字符串处理函数集,主要包括以下函数: 包括: IsNumeric——检查串是否为数字串 Upcase——变成大写串 Lowercase——变成小写串 Trim——截掉串尾的空格 RTrim——截掉串开始处的空格 LTrim——截掉串...

    C语言 不使用strcat函数实现连接两个字符串功能代码

    字符串连接就是将一个字符串连接到另一个字符串的末尾,使其组合成一个新的字符串,在字符串处理函数中,strcat 函数具有字符串连接功能。下面是用C语言实现不使用是strcat 函数实现连接两个字符串的功能。 源代码:...

    一些常用的字符串处理函数集合

    自己对源代码做的一些整理,包括:atoi itoa strcpy strcat strlen memcpy memset等等常用的字符串处理函数,提供源代码实现。

    C语言字符串处理库函数实现

    资料比较全地整理了string.h中常见的字符串处理函数,对每个函数完整地实现并有简要的注释。如果你喜欢深入研究C编译器技术,本资料值得你拥有。

    常见的c字符串处理函数的源代码

    收集常见的c库里的字符串跟内存操作源代码的实现。

    字符串基本操作-复制,连接,比较等

    字符处理:不使用 C 语言库函数自行编制函数实现字符串的复制、连接、转换为大写、小写、字符串比较功能 这里加载标准输入输出库只是为了输出测试结果函数本身不使用

    C-字符串处理算法与实现

    自定义函数实现 C-字符串基本操作 交换 C-字符串 C-字符串数组排序

    C语言字符串分割函数

    将一个字符串按分割串分割为字符串数组。 在处理字符串方面有很好的参考价值

    逗号分隔字符串,Vc 字符处理示例源码.rar

    逗号分隔字符串,Vc 字符处理示例源码, 以逗号为分隔点,自由任意拆分字符串,经常编写代码的朋友可能会想到Split,对,本代码就是使用Split函数实现分隔字符串,这相当实用,在日常编程中,对字符串的截娶过滤与...

    VB编程资源大全(源码 字符串)

    1,strs.zip 实现字节数组, 同c中的字符数组一样好用(6KB) 2,modules.zip 字符串处理的12个例子(13KB) 3,strings.zip 字符串处理函数(4KB) 4,stringfuncs.zip 字符串处理函数(9KB) 5,search&...

    C代码实例2:字符串处理

    编写一函数char *my_replace(char *s1, char *s2, char *s3), 实现如下功能:把字符串s1中所有出现的字符串s2都替换成字符串s3,并通过函数名返回替换后的新字符串,但不得破坏s1。例如,当s1=“aabcdabce”, s2=...

    C语言中字符串常用函数strcat与strcpy的用法介绍

    头文件:#include 功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。函数实现: ...

    删除给定字符串中的数字字符,并输出删除数字字符后的字符串

    具体实现上,定义了一个delnum函数,该函数接受一个字符数组s作为参数,并通过两个变量i和j来遍历字符串和构建新字符串。在遍历过程中,如果当前字符不是数字字符,则将其复制到新字符串中,同时更新变量j的值为j+1...

    VB编程资源大全(英文源码 字符串)

    1,strs.zip 实现字节数组, 同c中的字符数组一样好用(6KB)&lt;END&gt;&lt;br&gt;2,modules.zip 字符串处理的12个例子(13KB)&lt;END&gt;&lt;br&gt;3,strings.zip 字符串处理函数(4KB)&lt;END&gt;&lt;br&gt;4,stringfuncs.zip 字符串处理函数(9...

    PHP字符串比较函数strcmp()和strcasecmp()使用总结

    比较字符串是任何编程语言的字符串处理功能中重要的特性之一。在PHP中除了可以使用比较运算符号(==、&lt;或&gt;)加以比较外,还提供了一系列的比较函数,使PHP可以进行更复杂的字符串比较。如strcmp()、strcasecmp()...

    MySQL里实现类似SPLIT的分割字符串的函数

    下边的函数,实现了象数组一样去处理字符串。 一,用临时表作为数组 代码如下: create function f_split(@c varchar(2000),@split varchar(2)) returns @t table(col varchar(20)) as begin while(charindex(@split,@...

    C/C++面试之算法系列--几个典型的内存拷贝及字符串函数实现

    C/C++面试之算法系列--几个典型的内存拷贝及字符串函数实现 写一个函数,完成内存之间的拷贝。[考虑问题是否全面,是否考虑内存重叠问题] 返回void *支持链式操作,参数类型是void *以支持任意类型的指针,输入...

    c语言数据结构字符串模式匹配算法.zip

    KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。 一.简单匹配算法 先来看一个简单匹配算法的函数: ...

Global site tag (gtag.js) - Google Analytics