string的标准库练习

转载 2015年11月21日 12:35:34
#include <stdio.h>
#include <assert.h>

size_t strlen(const char *s);
void *memset(void *src, int n, size_t count);
char *strstr(const char *s1, const char *s2);
char *strcat(char *des, const char *src);
char *strncat(char *des, const char *src, size_t n);
int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
char *mystrcpy(char *des, const char *src);
char *mystrncpy(char *des, const char *src ,size_t n);


size_t strlen(const char *s)//计算字符串长度
{
	if( s == NULL)
		return 0;
	size_t length = 0;
	while(*s)
	{
		length ++;	//长度加一
		s ++;		//地址加一
	}
	return length;
}

void *memset(void *src, int c, size_t count)//第二参数为整形,原因为大多开发人员填入为0,转换成字符就是'\0',也就是终结符,如果是字符参数,不可以要用户填写'\0'吧!!!
{
	assert(src != NULL);//assert是出错提醒,在BUGED有效,在relseas无效,当有两个条件时,无法识别哪个出错
	char *tmp = (char*)src;//取得首地址
	while(count--)
	{
		*tmp = (char)c; 
		tmp ++;
	}
	return tmp;
}

char *strstr(const char *s1, const char *s2)//从字符串找存在指定的小字符串
{
	int i = 0;
	assert(s1 != NULL);
	if (s2 != NULL)
	{
		while( *s1 )
		{
			for(i = 0; *(s1+i) == *(s2+i); i++)
			{
				if( !*(s2+i+1) )
					return (char*)s1;//找到符合条件,字符串1返回找到值以后的全部字符
			}
			s1++;
		}
		return NULL;//搜索完未找到符合的返回NULL;
	}else{
		return (char*)s1;
	}
}

char *strcat(char *des, const char *src) //合并字符串
{
	char *address = des;
	assert( des != NULL );
	assert( src != NULL );
	while(*des)//取得第一个字符串最后一位地址
	{
		des++;	
	}
	while(*des++ = *src++)//将第二个字符串存储区内容赋给第一个字符串后面的
	//以上这句可以理解为 do {*des++ = *src; src++; while( *des != '\0' ) }
	{	
		NULL;
	}
	
	return address;
}

char *strncat(char *des, const char *src, size_t n)
{
	size_t des_len = strlen(des);
	size_t i;
	for (i = 0; i < n && src[i] != '\0'; i++)
	{
		des[des_len + i] = src[i];
	}
	des[des_len + i] = '\0';
	return des;
}

int strcmp(const char *s1, const char *s2)//比较字符串大小
{	
	while( *s1 == *s2 )
	{
		if( *s1 == '\0' )
			return 0;
		s1 ++;
		s2 ++;
	}
	return *s1 - *s2;
}

int strncmp(const char *s1, const char *s2, size_t n)
{	
	while( *s1 == *s2 && n > 0)
	{
		if( *s1 == '\0' )
			return 0;
		s1 ++;
		s2 ++;
		n --;
	}
	return *s1 - *s2;
}

char *mystrcpy(char *des, const char *src)//注意这里可能和系统中strcpy冲突,最好换个函数名称。
{
	assert(des != NULL);
	assert(src != NULL);
	char *addr = des;
	while(*src)
	{
		*des = *src;
		des++;
		src++;
	}
	*des = '\0';
	return addr;
}

char *mystrncpy(char *des, const char *src ,size_t n)//这里和strcpy存在相同问题
{
	assert(des != NULL);
	assert(src != NULL);
	char *addr = des;
	int i = 0;
	for(i = 0; i < n && *src != '\0'; i++)
	{
		*des = *src;
		des++;
		src++;
	}
	*des = '\0';
	return addr;
}



int main()
{
	char x[20]; 
	char y[20]={"abcxyz"};
	char *p_x = y;	
	memset(x, 0, sizeof(x));
	char *x1=strstr(y,"xy");
	printf("%s\n",x1);
	int i = 0;
	for(i = 0; i<5; i++)
		x[i] = 'a' + i;
	printf("x[] = %s\n",x);
	printf("strcat = %s\n",strcat(x, y));
	printf("strncat = %s\n",strncat(x, y,1));
	printf("strcmp = %d\n",strcmp("abd", "abd"));
	printf("strncmp = %d\n",strncmp("abc", "abd", 3));
	printf("x[] = %s\n",x);
	printf("mystrcpy = %s\n",mystrcpy(x,"desdd"));
	printf("mystrncpy = %s\n",mystrncpy(x,"desss",2));
	return 0;
}	

【c++】标准库中string类的使用、示例验证及注意点

/* ************************************************************************** * File Name: string_te...
  • qq_30594349
  • qq_30594349
  • 2017年02月13日 11:13
  • 347

C++标准库——字符串(Standard library: String)

Reference:The C++ Programming Language 4th edition (Bjarne Stroustrup) 1.字符分类(Character Classificat...
  • hrzr79011
  • hrzr79011
  • 2015年05月10日 08:17
  • 796

Java String类的练习和常用方法

第一个比较常用的string类中的.length( );该方法求字符串中的长度/下面我们举个例子public class Test { public static void main(Stri...
  • ss19497
  • ss19497
  • 2016年12月01日 11:22
  • 262

第十四章 14.8.2节练习

练习14.42 使用标准库函数对象及适配器定义一条表达式,令其 ()
  • chxw098
  • chxw098
  • 2014年09月18日 00:32
  • 549

字符串字面值与标准库string类型不是同一种类型

看到C++书上有一句话,不明白是什么意思,请大家赐教: 因为历史原因以及为了与C语言兼容,字符串字面值与标准库string类型不是同一种类型。这一点很容易引起混乱,编程时一定要注意区分字符串字面...
  • bit452
  • bit452
  • 2014年11月13日 11:07
  • 1040

[转] string和动态链接库——不仅仅如此

string
  • tony2278
  • tony2278
  • 2016年11月28日 17:14
  • 475

Lua_String标准库

local a = "cxm" local b = "zqr" -- 返回第n个字符的整数形式 print(string.byte(a, 2)) -- 返回整数对应转化后的字符,并把字符拼接返回 ...
  • c201038795050
  • c201038795050
  • 2015年04月15日 23:24
  • 326

C++学习:string的连接与赋值以及size()empty()

string的其他操作: 1.empty(),size()函数,对于string的整体信息的读取。 empty函数返回bool类型; size函数返回size_type类型。size_type是...
  • qq_28560971
  • qq_28560971
  • 2018年01月08日 08:38
  • 22

Linux下C++标准文件库编程

分类: Linux c++开发 电子书 2013-09-11 21:34 1074人阅读 评论(0) 收藏 举报 目录(?)[+] 19.1 Linux下C++文件的...
  • tangzhilinhk
  • tangzhilinhk
  • 2014年07月10日 11:50
  • 779

C 标准库—— string.h

strlen()遇\0退出,它返回的字符串的长度是真实的长度。
  • lanchunhui
  • lanchunhui
  • 2016年03月20日 22:05
  • 686
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:string的标准库练习
举报原因:
原因补充:

(最多只允许输入30个字)