模拟实现字符串函数及内存函数
16lz
2021-05-09
模拟实现strstr函数
strstr函数的功能是模式匹配。
实现my_strstr函数,首先确定函数的参数是两个字符串的地址,函数返回值类型也是一个地址
char* my_strstr(const char *str1,const char *str2){
定义s来接受主串str1的地址,定义t来接受模式串str2的地址
const char *s = str1;//主串 const char *t = str2;//模式串
定义i为主串的下标,j为模式串的下标,进行分析:当主串第一个字符和模式串第一个字符相等时,i和j同时加1,然后比较第二个字符,以此类推。直至遇见两个不同的字符,此时要把模式串与主串中的第二个字符重新开始比较,即j=0,i=i-j+1
int i, j; i = j = 0; while (s[i]!='\0'&&t[j]!='\0') { if (s[i] == t[j]) { i++; j++; } else { j = 0; i = i - j + 1; } }
最后还要进行判断,如果是t[j]=='\0',则返回字符串,否则的话,一定是主串先一步结束,即主串中不包含模式串,那么就返回NULL
if (t[j] == '\0') { return s+i-j; } return NULL;}
模拟实现strcat函数
strcat函数的功能是连接字符串
char *my_strcat(char *strDest,const char *strSrc)//模拟实现strcat函数{ char *str1 = strDest;//定义str1指向目标字符串的地址 assert(strDest != NULL && strSrc != NULL); while (*str1 != '\0') { str1++; }//str1指向该字符串'\0'的位置 while (*strSrc!='\0') { *str1++ = *strSrc++; } return strDest;}
模拟实现strcmp函数
strcmp函数功能是比较两个字符串对应位置的字符的ASCLL码
char *my_strcpy(char *strDest,const char *strSrc)//模拟实现strcpy函数{ assert(strDest!=NULL&&strSrc!=NULL); char *str1 = strDest; const char *str2 = strSrc; while (*str2!='\0') { *str1++ = *str2++; } *str1 = '\0'; return strDest;}
模拟实现strlen
计算字符串长度
size_t my_strlen(const char *str)//模拟实现strlen{ assert(str!=NULL); const char *strEnd = str; while (*strEnd!='\0') { strEnd++; } return strEnd - str;}
模拟实现memset函数
memset函数功能是对一片内存空间进行初始化
/*memset函数按字节对内存块进行初始化,所以不能用它将int数组初始化为0和-1之外的其他值(除非该值高字节和低字节相同)*/void *my_memset(void *dest, int n, size_t count)//模拟实现memset函数{ assert(dest!=NULL); char *pdest = (char*)dest;//强转是为了一次只操作一个字节 while (count--!=0) { *pdest++ = n; } return dest;}
模拟实现memcpy函数
memcpy函数功能是将一片内存空间里的数据复制给另一片内存空间,但如果发生内存重叠就无法解决,需要使用memmove函数
//'\0'也会被拷贝void *my_memcpy(void *strDest,const void *strSrc,size_t count)//模拟实现memcpy函数{ char *str1 =(char*)strDest; char *str2 = (char*)strSrc; assert(strDest != NULL); while (count--!=0) { *str1++ = *str2++; } return strDest;}
模拟实现memmove函数
与memcoy函数功能相似,可以解决内存重叠问题
void *my_memmove(void *strDest, const void *strSrc, size_t count)//模拟实现memmove函数{ assert(strDest!=NULL&&strSrc!=NULL); char *str1 =(char *) strDest; const char *str2 = (char *)strSrc; //1.源地址只要大于目标地址,从后面的空间往前复制数据,不会有影响 //2.目标数组在源数组整体之后,即目标地址大于原地址+原数组元素个数,数据也可以照常复制 if (str2>=str1||str1>=str2+count) { while (count-- != 0) { *str1++ = *str2++; } } //目标地址与原地址发生内存重叠,即:目标数组的初始N个元素就是源数组的末尾N个元素,如果从源数组的开头进行复制,到结尾时,末尾N个元素的值就已经被修改了。 //解决方案:从源数组的末尾往前进行数据复制 else { str1 = str1 + count-1; str2 = str2 + count-1; while (count-- != 0) { *str1-- = *str2--; } } return strDest;}
©著作权归作者所有:来自51CTO博客作者zzy613的原创作品,如需转载,请注明出处,否则将追究法律责任
更多相关文章
- #PHP函数的返回值,参数,匿名函数
- 无服务器(Serverless)本质上就是虚拟主机(VirtualHost)的一次升
- 总结函数的返回值,参数 2. 实例演绎你对课上回调函数,匿名函数的
- PHP:字符串系统函数,ASCII字符集转换,url解析函数,字符串散列处
- Django 使用正则匹配URL 并将匹配成功的值传递给视图函数
- 2.3 激励函数
- 1.算法课程主要内容及有关概念: 复杂度的界定, 计算复杂性理论,
- 函数的返回值,参数
- Go语言个人学习笔记(Pythonista)