模拟实现常见字符串操作函数

1. strcpy
函数名 | 说明 |
---|---|
函数原型 | char *strcpy(char* dest, const char *src) |
参数说明 | dest 为指向用于存储复制内容的目标数组,src 为要复制的字符串 |
头文件 | stdio.h |
描述 | 把 src 所指向的字符串复制到 dest。 |
返回值 | 该函数返回一个指向最终的目标字符串 dest 的指针 |
注意 | 如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况 |
模拟实现
// 模拟实现 strcpy
#include<iostream>
#include<assert.h>
using namespace std;
char* my_strcpy(char * dst, char const* src)
{
assert(dst);
assert(src);
char* ret = dst;
while (*dst++ = *src++);
return ret;
}
int main()
{
/*
char* ch1 = "acc";
char* ch2 = "acc";
*/
//注意这里要用数组,字符串常量区不可写
char ch1[10] = "123456798";
char ch2[] = "abc";
cout << my_strcpy(ch1, ch2) << endl;
system("pause");
return 0;
}
2.strcmp
函数名 | 说明 |
---|---|
函数原型 | int strcmp(const char *str1, const char *str2) |
参数说明 | str1,str2 为要进行比较的两个字符串 |
头文件 | string.h |
描述 | 用于比较两个字符串 ,并根据比较结果返回整数 |
返回值 | 按照ASCII比较,若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数 |
模拟实现
// 模拟实现 strcmp
#include<iostream>
#include<assert.h>
using namespace std;
int my_strcmp(char const* dst, char const* src)
{
assert(dst);
assert(src);
while (*dst == *src && *dst != '\0')
{
dst++;
src++;
}
return *dst-*src;
}
int main()
{
char* ch1 = "acc";
char* ch2 = "acd";
cout << my_strcmp(ch1, ch2) << endl;
system("pause");
return 0;
}
3.strcat
函数名 | 说明 |
---|---|
函数原型 | extern char *strcat(char *dest, const char *src) |
参数说明 | dest指向目标字符串,src为指向源字符串 |
头文件 | C语言中string.h / C++中cstring |
描述 | 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾 |
返回值 | 返回指向dest的指针 |
注意 | 目标字符串要足够容纳追加后的字符串 |
模拟实现
// 模拟实现 strcat
#include<iostream>
#include<assert.h>
using namespace std;
char* my_strcat(char* dst, char const* src)
{
assert(dst);
assert(src);
char* ret = dst;
while (*ret!='\0')
ret++;
while (*ret++ = *src++);
return dst;
}
int main()
{
char ch1[10] = "acc";
char ch2[10] = "123";
cout << my_strcat(ch1, ch2) << endl;
system("pause");
return 0;
}
4.strncat
函数名 | 说明 |
---|---|
函数原型 | char * strncat(char *dest, const char *src, size_t n) |
参数说明 | dest指向目标字符串,src为指向源字符串 |
头文件 | string.h |
描述 | 把src所指字符串的前n个字符添加到dest所指字符串的结尾处,并覆盖dest所指字符串结尾的’\0’ |
返回值 | 返回指向dest的指针 |
模拟实现
// 模拟实现 strncat
#include<iostream>
#include<assert.h>
using namespace std;
char* my_strncat(char* dst, char const* src, int n)
{
assert(dst);
assert(src);
char* ret = dst;
while (*ret != '\0')
ret++;
while (n--)
{
*ret++=*src++;
}
*ret = '\0';
return dst;
}
int main()
{
char ch1[10] = "acc";
char ch2[10] = "123";
cout << my_strncat(ch1, ch2,4) << endl;
system("pause");
return;
}
5.memcpy
函数名 | 说明 |
---|---|
函数原型 | void *memcpy(void *des, void *src, unsigned n); |
参数说明 | des指向目标内存,类型强制转换为 void* 指针。source 指向要复制的数据源,类型强制转换为 void* 指针。n为 要被复制的字节数。 |
头文件 | C语言中string.h / C++中cstring |
描述 | 从源source所指的内存地址的起始位置开始拷贝n个字节到目标destin所指的内存地址的起始位置中 |
返回值 | 返回指向des的指针 |
模拟实现
// 模拟实现 memcpy
#include<iostream>
#include<assert.h>
using namespace std;
char* my_memcpy(char* dst, const char* src)
{
char* ret = dst;
assert(dst);
assert(src);
while (*dst++ = *src++);
return ret;
}
int main()
{
char ch1[12] = " ";
my_memcpy(ch1, "hello");
cout << ch1 << endl;
system("pause");
return 0;
}