字符串相关函数的模拟实现

要模拟库函数的实现,必须要搞清楚的是在程序调用中它的实现原理是什么,接下来就讲解几个字符串相关的函数,比如strcmp(),strncmp(),strcat(),strncat()......


字符串函数主要包括受限制字符串函数与不受限制字符串函数,那么什么是受限制字符串函数与不受限制字符串函数呢?!简单来讲,不受限制字符串函数就是使用这些函数时,它们只是通过字符串结尾的NULL 字符来确定字符串的长度,例如我们常用的strcmp(),strcpy();而受限制的字符串函数就是这些函数她们接受一个显示的长度参数,来限定要复制或者比较的字符个数,例如strncmp(),strncpy(),这里边的n在函数名和函数传参中都有,n即为要操作的字符个数。


一、不受限制字符串函数

1.strcpy()

库函数原型:char *strcpy( char *strDestination, const char *strSource );

实现:将拷贝的字符串str2一个一个拷贝到字符数组str1中,直到字符数组遇到‘\0’结束标志后拷贝完成。在拷贝时,str2中的‘\0‘一同被拷贝。

char *my_strcpy(char *str1,const char *str2)
{
	char *start = str1;        //保存字符数组2的首地址
	assert(str1);
	assert(str2);
	while(*str1++ =  *str2++)
	{
		;
	}
	return start;
}


2.strlen()

库函数原型:size_t strlen( const char *string );

实现:在遇到‘\0‘之前,指针每向后挪动一次,计数器加一次

int my_strlen(const char *str1)
{
	int count = 0;
	assert(str1);
	while(*str1++)
	{
		count++;
		//str1++;
	}
	return count;
}

3.strcmp()

库函数原型:int strcmp( const char *string1,
const char *string2 );

比较规则:两个字符串自左向右逐个字符比较(按ASCII码的值比较),知道出现不同的字符或者遇到‘\0’。

(1)如果字符全部相等,则两个字符串相等;

(2)如果出现不同的字符,则以第一对不相同字符的比较结果为准。

比较的结果由函数值带回:

(1)字符串1 = 字符串2,返回0;

(2)字符串1 > 字符串2 ,返回一个正整数;

(3)字符串1 < 字符串2,返回一个负整数。

int my_strcmp(const char *str1,const char *str2)
{
	assert(str1);
	assert(str2);
	while(*str1 == *str2)
	{
		if(*str1 != ‘\0‘)
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

4.strcat()

库函数原型:char *strcat( char *strDestination, const char *strSource );

实现:指针指到字符数组1 的结尾时,将字符串2 中的字符一个一个追加到字符数组1 的后面,指针向后挪一次,字符拷贝一个,直到字符数组1 遇到‘\0’时追加完毕。(字符数组1 要足够大,能把字符串2 都添加进去)

char *my_strcat(char *str1,const char *str2)
{
	char *start = str1;    //保存字符数组的首地址
	assert(str1);
	assert(str2);
	while(*str1)
	{
		str1++;
	}
	while(*str2)
	{
		*str1 = *str2;
		str1++;
		str2++;
	}
	*str1 = ‘\0‘;
	return start;
}

5.strstr()

库函数原型:char *strstr( const char *string, const char *strCharSet );

实现:在字符串str1 中找子字符串str2,如果能找到,就返回子串的起始位置,如果找不到,就返回NULL

char *my_strstr(const char *str, const char *substr)
{
	const char *str1 = str;
	const char *str2 = substr;
	const char *start = NULL;         
	assert(str);
	assert(substr);
	if(*str2 == ‘\0‘)
		return (char *)str1;
	while(*str1)
	{
		start = str1;           //找到的第一个字符保存
		while(*str1 && *str2 && *str1 == *str2)
		{
			str1++;
			str2++;
		}
		if(*str2 == ‘\0‘)
			return (char *)start;
		str1 = start + 1;
		str2 = substr;
	}
	return NULL;
}

二、受限制字符串函数

1.strncat()

原型:char *strncat( char *strDest, const char *strSource, size_t count );

count为要追加的字符个数

char *my_strncat(char *str1,char *str2,size_t n)
{
	char *start = str1;      //保存字符数组1 的起始地址
	assert(str1);
	assert(str2);
	while(*str1)
	{
		str1++;
	}
	while(n)
	{
		*str1 = *str2;
		str1++;
		str2++;
		n--;
	}
	*str1 = ‘\0‘;
	return start;
}

2.strncmp()

函数原型:char *strncpy( char *strDest, const char *strSource, size_t count );

int my_strncmp(const char *str1,const char *str2,size_t n)
{
	assert(str1);
	assert(str2);
	while(n && *str1 && *str1 == *str2)
	{
		if(*str1 == ‘\0‘)
			return 0;
		str1++;
		str2++;
		n--;
	}
	return *str1 - *str2;
}

3.strncpy()

库函数原型:char *strncpy( char *strDest, const char *strSource, size_t count );

char *my_strncpy(char *str1,char *str2,size_t n)
{
	char *start = str1;
	assert(str1);
	assert(str2);
	while((n--) && (*str1++ = *str2++))
	{
		//*str1++ = *str2++;
		//n--;
	}
	*str1 = ‘\0‘;
	return start;
}


时间: 2024-10-15 14:56:38

字符串相关函数的模拟实现的相关文章

黑马程序员---C基础9【字符串的输入输出】【字符串相关函数】【指针】【指针变量初始】【二级指针】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [字符串的输入输出] 1.字符串输出: %s-------从给定的地址开始输出字符直到遇到\0停止: printf("%s\n",&a[3]);  printf("%s\n",a); char a[]="hellowo\0rd!"; 2.字符串输入: 从键盘上接收一个字符串,保存在以a为首地址的字符数组中 scanf("%s&

基本字符串相关函数,基本宏,内存相关函数,类型转换函数实现合集

1.常用宏或函数的实现_T,_L宏:#define unsigned short L#define _T(x)       __T(x)#define _TEXT(x)    __T(x) #ifdef  _UNICODE#define __T(x) L##x     #else#define __T(x) x          #endif #define _L(x) L##x assert宏实现:#define assert(expr)do{    if (!(expr))    {    

字符串相关函数整理

string.h 中字符串相关函数 按功能分类: 字符串连接: strcat : char* strcat(char* destination, const char* source); strncat : char* strcat(char* destination, const char* source, size_t num); cat 意思是catenate.连接的意思. strncp 是strcat的安全版本号.能够防止越界. 从定义上能够看出带是将const的字符串连接到不带cons

3.mysql的中文问题,database级操作,表级操作,数据CRUD,分组操作,时间和日期,字符串相关函数,表的约束

 1 连接MYSQL服务器:mysql–uroot –p123456 查看中文问题 show variables like 'character%'; 2 修改mysql的字符集,退出mysql提示符界面: mysql -uroot -p--default_character_set=gbk; 3  数据库的操作:创建,查看,修改,删除 *创建: 创建一个名称为mydb1的数据库. createdatabase mydb1; 创建一个使用utf-8字符集的mydb2数据库. create d

python字符串相关函数 *title *upper *lower *swapcase *len *count *find *index *starts with *endswith *isalpha *isdecimal *split *center *strip *replace

# ### 字符串相关函数 (函数就是方法的意思,完成某个功能)""" 语法: 字符串.函数 """ #*capitalize 字符串首字母大写 strvar = "this is my world"res = strvar.capitalize()print(res) # *title 每个单词的首字母大写 (非字母类的就可以让后面字符大写)# strvar = "this is my world"str

3. 循环结构 ; 字符串相关函数 2019-10-29

- 代码块 以冒号作为开始,用缩进来划分相同的作用域,这个整体是一个代码块作用域:作用的区域 -流程控制 (1)流程控制的定义(2)流程控制的结构 -分支结构 关键字:if elif else(1)分支结构的种类(2)分支结构的特点 -循环结构 关键字:while / for..in..(1)循环结构的种类(2)循环结构的特点? -关键字的使用 pass / break / continue 字符串相关操作 (1)字符串的拼接(2)字符串的重复(3)字符串跨行拼接(4)字符串的索引(5)字符串的

高精度问题之大数相加(原来就是用字符串相加,模拟手算这么简单!)

解题心的: 就是基本的一对一模拟手算..借助c++的string 不用逆序运算了.很方便的补0.  最后处理下前导0的问题. #include <iostream> #include <string> using namespace std; // 实现大数相加 结果存放在num中 void bigIntergerAdd(string &num, string add) { int goBit = 0; // 存放进位 // 先交换下顺序 加数的位数要比较少 if (num

【bzoj4974】字符串大师 逆模拟KMP

题目描述 一个串T是S的循环节,当且仅当存在正整数k,使得S是$T^k$(即T重复k次)的前缀,比如abcd是abcdabcdab的循环节.给定一个长度为n的仅由小写字符构成的字符串S,请对于每个k(1<=k<=n),求出S长度为k的前缀的最短循环节的长度$per_i$.字符串大师小Q觉得这个问题过于简单,于是花了一分钟将其AC了,他想检验你是否也是字符串大师. 小Q告诉你n以及$per_1,per_2,...,per_n$,请找到一个长度为n的小写字符串S,使得S能对应上per. 输入 第一

【hihocoder 1039 字符串消除】模拟

题目链接:http://hihocoder.com/problemset/problem/1039 题意:给定一个只由{A, B, C}组成的字符串s,长度为n, 故包含n+1个空隙:现要求在某个空隙插入一个来自{A, B, C}的字符,然后按照以下“消除规则”对插入后的字符串进行消除操作,问最多能消掉几个字符(包含插入的一个). 消除规则: 1. 自左至右扫描当前字符串,若字符v从某个位置开始连续出现了2次及以上,则此区间内的v全部消除: 2. 重复步骤1直至不再有可消除的字符. 思路:模拟,