c语言常见字符串函数经典实现

最近把一些常见的c语言的字符串库函数参照着网上的程序自己实现了一下,也是方便自己复习总结,里面的实现比较经典,下面的函数在我电脑vs2005上都能通过,但未进行严格的测试。点击展开目录,可以直接达到感兴趣的函数实现。

/************************************************************************/
/* 1.strcpy函数实现
   2.strncpy实现
   3.strcat函数实现
   4.strncat函数实现
   5.strdup实现
   6.strchr实现
   7.strrchr函数实现
   8.strpbrk函数
   9.strstr实现
   10.strlen实现
   11.strlen另一种实现
   12.strcmp函数实现
   13.strcmpy的一种标准实现
   14.strncpy函数实现
   15.memset函数实现*/
/************************************************************************/

1.strcpy函数实现

//功能说明:将source的字符串复制到dest来
//dest所指向的空间必须有足够的内存来容纳source所指向的字符串
char * my_strcpy(char *dest, const char *source)
{
	assert(dest!=NULL && source!=NULL);
	char *r = dest;

	//*(dest++),先返回*dest, 然后dest++
	//(*(dest++) = *(source++)返回最左边表达式的值
	while ((*(dest++)=*(source++)) != '\0');

	return r;
}
/*
1.注意参数的命名上规范,让人容易明白怎么使用函数
2.第二个参数类型是const char *,防止修改源字符串
3.函数返回值是char *,可以实现链式表达式
4.参数合法性检查,下面的函数同样要遵循这些
*/

2.strncpy实现

//将source的前n个字符串复制到dest
char * my_strncpy(char *dest, const char *source, int n)
{
	assert(dest!=NULL && source!=NULL);

	char *r = dest;

	//注意n--和后面一堆不能换,否则会多复制一个
	while (n-- && (*(dest++)=*(source++))!='\0');

	return r;

}

3.strcat函数实现

//将source指向的字符串链接在dest后面
char * my_strcat(char *dest, const char *source)
{
	assert(dest!=NULL && source!=NULL);

	char *r = dest;

	while (*(dest) != '\0')
	{
		dest++;
	}

	while ((*(dest++)=*(source++)) != '\0');

	return r;
}

4.strncat函数实现

//将source特定数目字符串链接到dest后面
char * my_strncat(char *dest, const char *source, int n)
{
	assert(dest!=NULL && source!=NULL);

	char *r = dest;

	while (*(dest) != '\0')
	{
		dest++;
	}

	while (n-- && (*(dest++)=*(source++))!='\0');

	return r;
}

5.strdup实现

//该函数将预先配置内存,然后将制定字符串装入内存
char * my_strdup(const char *pStr)
{
	assert(pStr != NULL);

	char *r = (char *)malloc(strlen(pStr)+1);
	if (NULL == r)
	{
		printf("Memory Failed!\n");
		exit(1);
	}

	return my_strcpy(r, pStr);

}

6.strchr实现

//函数功能在字符串中查找指定的第一个字符,并返回指向该字符的指针
//若未找到,则返回指向'\0'的字符串指针
char * my_strchr(const char *pStr, char ch)
{
	assert(pStr != NULL);
	while (*pStr!='\0' && *pStr!=ch)
	{
		pStr++;
	}
	return (char *)pStr;
}

7.strrchr函数实现

//函数功能:查找一个字符c在另一个字符串str中末次出现的位置(也就是从str的右侧开始查找字符c首次出现的位置)
char * my_strrchr(const char *pStr, char ch)
{
	assert(pStr != NULL);

	const char *r = NULL;

	while (*pStr != '\0')
	{
		if (*pStr == ch)
		{
			r = pStr;
		}
		pStr++;
	}
	return (char *)r;
}

8.strpbrk函数

//函数功能:在两个字符串中寻找首次共同出现的字符,返回该字符在str1中的地址
char *my_strpbrk(const char *str1, const char *str2)
{
	assert(str1!=NULL && str2!=NULL);

	const char *tmp = str2;

	while (*str1 != '\0' )
	{
		tmp = str2;
		while (*tmp != '\0')
		{
			if (*str1 == *tmp)
			{
				return (char *)str1;
			}
			tmp++;
		}

		str1++;
	}
	return NULL;
}

9.strstr实现

//若字符串2包含在字符串1里面,返回它在字符串1中的位置,否则返回NULL
char * my_strstr(const char *strDes, const char *str)
{
	assert(strDes!=NULL && str!=NULL);

	const char *tmpDes = NULL;
	const char *tmpStr = NULL;

	while (*strDes != '\0')
	{
		for (tmpDes=strDes, tmpStr=str;
			*tmpDes==*tmpStr && *tmpStr!='\0';
			tmpDes++, tmpStr++)
		{}		

		if ('\0' == *tmpStr)
		{
			return (char *)strDes;
		}

		strDes++;
	}

	return NULL;
}

10.strlen实现

//该函数返回字符串长度,不包括后面的'\0'
int my_strlen(const char *str)
{
	assert(str != NULL);

	int k = 0;
	while (++k && *(str++)!='\0');

	return k-1;

}

11.strlen另一种实现

int my_strlen(const char *str)
{
	assert(str != NULL);

	const char *eos = str;		//eos means end of string
	while (*(eos++) != '\0');

	return (int)(eos - str - 1);
}

12.strcmp函数实现

//两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止
//s1>s2,返回值大于0,s1<s2返回值小于0,否则等于0
int my_strcmp(const char *str1, const char *str2)
{
	assert(str1!=NULL && str2!=NULL); 

	while (*str1!='\0' && *str2!='\0' && *str1==*str2)
	{
		str1++;
		str2++;
	}

	return (*str1 - *str2);
}

13.strcmpy的一种标准实现

int my_strcmp(const char *str1, const char *str2)
{
	assert(str1!=NULL && str2!=NULL); 

	int ret = 0;
	while (!(ret=*(unsigned char *)str1-*(unsigned char *)str2) && *str2!='\0')
	{
		printf("%c - %c = %d\n", *str1, *str2, *str1-*str2);
		str1++;
		str2++;
	}
	if (ret > 0)
	{
		return 1;
	}
	else if (ret < 0)
	{
		return -1;
	}
	else
	{
		return 0;
	}
}

14.strncpy函数实现

//函数比较两个字符串中前n个字符串大小
int my_strncmp(const char *str1, const char *str2, int n)
{
	assert(str1!=NULL && str2!=NULL); 

	if (n <= 0)
	{
		return 0;
	}

	while (--n && *str1!='\0' && *str1==*str2)
	{
		str1++;
		str2++;
	}

	return (*str1 - *str2);
}

15.memset函数实现

//将指定内存区域的前count个字节设定为指定值
void *my_memeset(void *buffer, int c, unsigned int count)
{
	if (count <= 0)
	{
		return buffer;
	}

	assert(buffer != NULL);

	char *p = (char *)buffer;
	while (count--)
	{
		*(p++) = (char)c;
	}
	return buffer;

}
时间: 2024-10-07 05:31:20

c语言常见字符串函数经典实现的相关文章

C语言常见字符串函数实现

#include <stdio.h> #include <stdlib.h> #include <assert.h> int my_strlen(char *s) { assert(s!=NULL); int count=0; while(*s!='\0') { s++; count++; } return count; } char *my_strcpy(char *s1,const char *s2) { assert(s1!=NULL); assert(s2!=N

C语言常见字符串操作函数总结

1. bcmp 原型:extern int bcmp(const void *s1, const void *s2, int n); 用法:#include <string.h> 功能:比较字符串s1和s2的前n个字节是否相等 说明:相等返回0,否则返回非0值 2. bcopy 原型:extern void bcopy(const void *src, const void *dest, int n); 用法:#include <string.h> 功能:将字符串src的前n个字节

C语言各类字符串函数的实现

C语言各类字符串函数的实现 开学就要开始找工作了,我觉得这些函数被问到的几率还是很大的,所以在这里与大家分享 strlen函数 原型: #include <string.h> unsigned int strlen (char *s); 功能:计算指定的字符串s 的长度,不包括结束字符"\0". 我的实现: /************************************************************************* > File

0709 C语言常见误区----------函数指针问题

1.函数指针的定义 对于函数 void test(int a, int b){ // } 其函数指针类型是void (* ) (int , int), 注意这里第一个括号不能少, 定义一个函数指针,void (* pfunc)(int , int) ,其中pfunc就是函数指针类型, 它指向的函数类型必须是返回值为void, 参数为两个int的. 2.函数指针赋值 函数指针可以直接用函数名赋值,pfunc = test, 或者 pfunc = &test: 3.调用函数指针 pfunc(3, 4

C语言分割字符串函数strtok

在编程过程中,有时需要对字符串进行分割.而有效使用这些字符串分隔函数将会给我们带来很多的便利. 下面我将在MSDN中学到的strtok函数做如下翻译. strtok :在一个字符串查找下一个符号 char *strtok( char *strToken, const char *strDelimit ); 返回值:返回指向在strToken字符串找到的下一个符号的指针,当在字符串找不到符号时,将返回NULL.每 次调用都通过用NULL字符替代在strToken字符串遇到的分隔符来修改strTok

常见字符串函数

SUBSTRING函数 作用:截取字符串 语法:SUBSTRING(字符串,开始位置,结束位置) 示例:SELECT SUBSTRING('床前明月光疑是地上霜',3,5) 结果:明月光疑是 CHARINDEX函数 作用:查找字符串的起始位置 语法:CHARINDEX(需查找的字符串,字符串[,起始位置]) 如果没有录入起始位置则默认从第一个开始查找 示例: SELECT CHARINDEX('知','知之为知之') 结果:1 SELECT CHARINDEX('知','知之为知之',2) 结果

c语言中字符串函数的使用

#include<stdio.h> #include<string.h> /* char s1[]="I am a student"; char s2[20]="teacher"; char s3[]="student"; int result; char s4[20],*p; 1.串的长度 int strlen(char *str): printf("%d\n",strlen(s1));//长度为14

mysql学习笔记(五)--- 字符串函数、日期时间函数

一.常见字符串函数: 1.CHAR_LENGTH  获取长度(字符为单位) 2.FORMAT  格式化 3.INSERT  替换的方式插入 4.INSTR  获取位置 5.LEFT/RIGHT  取左.取右 6.LENGTH   获取长度(字节为单位) 7.LTRIM/RTRIM/TRIM 去空格(左/右/自定义) 8.STRCMP  字符串比较 9.CONCAT  字符串拼接 10.SUBSTRING  字符串截取 1.CHAR_LENGTH:获取长度(字符为单位) CHAR_LENGTH()

MySQL字符串函数、日期时间函数

MySQL字符串函数.日期时间函数 一.常见字符串函数: 1.CHAR_LENGTH  获取长度(字符为单位) 2.FORMAT  格式化 3.INSERT  替换的方式插入 4.INSTR  获取位置 5.LEFT/RIGHT  取左.取右 6.LENGTH   获取长度(字节为单位) 7.LTRIM/RTRIM/TRIM 去空格(左/右/自定义) 8.STRCMP  字符串比较 9.CONCAT  字符串拼接 10.SUBSTRING  字符串截取 1.CHAR_LENGTH:获取长度(字符