栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

字符串函数以及模拟实现

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

字符串函数以及模拟实现

文章目录
  • 一.字符串函数
    • 1.1 strlen
    • 1.2 strcpy
    • 1.3 strcat
    • 1.4 strcmp
    • 1.5 strncpy
    • 1.6 strncat
    • 1.7 strncmp
    • 1.8 strstr
    • 1.9 strtok
    • 1.10 strerror
    • 1.11 memcpy
    • 1.12 memmove
    • 1.13 memcmp

一.字符串函数 1.1 strlen
size_t strlen(const char* str)

注意:
1.字符串必须以''结尾
2.strlen返回类型为size_t,即unsigned int
3.strlen函数计算的是第一个''前的字符个数(不包括'')
//模拟实现
size_t my_strlen(const char* arr)
{
	assert(arr);            //断言,不为空指针
	size_t count = 0;       //类型为size_t
	while (*arr++ != '')  //先判断,后++
		count++;
	return count;
}
1.2 strcpy
char* strcpy(char* destination,const char* source);

注意:
1.源字符串必须以''结尾
2.会将''拷贝进目标字符串
3.目标空间必须足够大,保证能正常复制
4.目标空间必须可变(?)
//模拟实现
char* my_strcpy(char* dest, const char* source)
{
	assert(dest && source);
	char* ret = dest;               //创建一个变量记录目标字符串的起始位置
	while (*dest++ = *source++)     //将''复制过去后while判断为0,结束循环
		;
	return ret;
}
1.3 strcat
char* strcat(char* destination,const char* source)

注意:
1.该函数为字符串追加函数,如在"hello"后面追加"world"
2.返回值为目标字符串的首字符地址
3.目标空间必须足够大,且可以改变
4.源字符串必须以''结尾

重点:
字符串追加不能自己加自己
因为在追加时会破坏自己本来的数据,即’’被破坏,无法停下
//模拟实现
char* my_strcat(char* dest, const char* source)
{
	assert(dest && source);
	char* ret = dest;
	//while (*dest++ != '')
	//	;
	//如果用上面那个,则当*dest==''时dest又加了一次
	while (*dest != '')
	{
		dest++;
	}
	while (*dest++ = *source++)
		;
	return ret;
}
1.4 strcmp
int strcmp(const char* str1,const char* str2)

strcmp()函数的功能是比较两个字符串,从两个字符串的第一个字符开始比较,比较ASCII值大小,
如果相同则比较下一对字符,知道比出结果或者碰到字符串末尾

注意:
1.第一个字符串大于第二个字符串,则返回大于0的数字
2.如果相同,则返回0
3.第一个字符串小于第二个字符串,则返回小于0的数字
//模拟实现
int my_strcmp(const char* arr1, const char* arr2)
{
	assert(arr1 && arr2);
	while (*arr1 == *arr2)
	{
		if (*arr1 == '')
			return 0;
		arr1++;
		arr2++;
	}
	return *arr1 - *arr2;
}
1.5 strncpy
char* strncpy(char* destination,const char* source,size_t num)

注意:
1.拷贝num个字符从源字符串到目标空间
 (与strcpy类似,但可以控制拷贝的字符个数)
2.如果源字符串的长度小于num,则拷贝完字符串之后,在目标的后面追加0,直到num
//模拟实现
char* my_strncpy(char* destination, const char* source,size_t num)
{
	assert(destination && source);
	char* cmp = destination;
	while (num)
	{
		if (*source != '')
			*destination++ = *source++;
		else
			*destination++ = '';
		num--;
	}
	return cmp;
}
1.6 strncat
char* strncat(char* destination,const char* source,size_t num)

与strcat函数类似,但可以控制追加字符的个数,如果源字符串长度小于num,则在后面补0,直到num
//模拟实现
char* my_strncat(char* destination, char* source, size_t num)
{
	assert(destination && source);
	char* tmp = destination;
	while (*destination)
		destination++;
	while (num)
	{
		if (*source != '')
			*destination++ = *source++;
		else
			*destination++ = '';
		num--;
	}
	*destination = '';
	return tmp;
}
1.7 strncmp
int strncmp(const char* str1,const char* str2,size_t num)

比较到出现字符不一样或者一个字符串结束或者num个字符全部比较完
//模拟实现
int my_strncmp(const char* str1, const char* str2, size_t num)
{(c
	while (*str1==*str2 && num)
	{
		if (*str1 == '')
			return 0;
		str1++;
		str2++;
		num--;
	}
	if (num == 0)
		return 0;
	return *str1 - *str2;
}

1.8 strstr
char* strstr(const char* str1,const char* str2)

注意:
1.该函数是在一个字符串中找到子字符串的起始位置
2.如果没有找到,则返回NULL
//模拟实现
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	const char* arr1 = str1;
	const char* arr2 = str2;
	const char* p = str1;
	while (*p)
	{
		p = arr1;
		while (*arr1!='' && *arr1 == *arr2 && *arr2!='')
		{
			arr1++;
			arr2++;
		}
		if (*arr2 == '')
			return (char*)p;
		arr1 = p + 1;
		arr2 = str2;
	}
	return NULL;
}
1.9 strtok
char* strtok(char* str,const char* sep)

注意:
1.sep参数是个字符串,定义了用作分隔符的字符集合
2.strtok函数找到str中的下一个标记,并将其用  结尾,返回一个指向这个标记的指针。      
  (strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
3.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
4.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
5.如果字符串中不存在更多的标记,则返回 NULL 指针。
//运行案例
int main ()
{
    char str[] ="- This, a sample string.";
    char * pch;
    printf ("Splitting string "%s" into tokens:n",str);
    pch = strtok (str," ,.-");
    while (pch != NULL)
    {
        printf ("%sn",pch);
        pch = strtok (NULL, " ,.-");
    }
    return 0;
}
1.10 strerror
char* strerror(int errnum)
作用:返回错误码所对应的错误信息

注意:
1.头文件为 #include
2.errno-> c语言设置的一个全局的错误码存放的变量
  当出现错误时,会将错误码自动存在errno中
//使用案例
FILE* pf=fopen("test.txt","r");
if(pf==NULL)
{
      printf("%sn",strerror(errno));
}
1.11 memcpy
void * memcpy ( void * destination, const void * source, size_t num )

注意:
1.函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
2.这个函数在遇到 '' 的时候并不会停下来。
3.如果source和destination有任何的重叠,复制的结果都是未定义的。
//模拟实现
void* my_memcpy(void* dest, const void* soc, size_t sz)
{
	assert(dest && soc);
	void* ret = dest;
	while (sz--)
	{
		*((char*)dest) = *((char*)soc);
		(char*)dest = (char*)dest + 1;
		(char*)soc = (char*)soc + 1;
	}
	return ret;
}
1.12 memmove
void * memmove ( void * destination, const void * source, size_t num )

注意:
1.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
2.如果源空间和目标空间出现重叠,就得使用memmove函数处理。
//模拟实现
//处理有重叠的两个字符串时,想法就是考虑在区域还没被复制时就已经操作完成
//所以这时候考虑从前往后复制还是从后往前复制

void* my_memmove(void* dest, const void* sorc, size_t sz)
{
	assert(dest && sorc);
	void* ret = dest;
	if (sorc >= dest)
	{
		while (sz--)
		{
			*((char*)dest) = *((char*)sorc);
			(char*)dest = (char*)dest + 1;
			(char*)sorc = (char*)sorc + 1;
		}
	}
	else
	{
		while (sz--)
			*((char*)dest + sz) = *((char*)sorc + sz);
	}
	return ret;
}
1.13 memcmp
int memcmp ( const void * ptr1, const void * ptr2, size_t num )

作用:比较从ptr1和ptr2指针开始的num个字节
注意:
1.memcmp不会碰到''停下
2.num不能超过两个比较对象的字节大小

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1032848.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号