1.strcpy拷贝函数
#include<string.h>
char* strcpy(char *dst,char const *src);
C语言本身有自己的拷贝字符串,该函数接收两个参数,一个是源字符数组,一个是目标字符数组。调用该函数一定要保证dst字符数组的空间足够大,不然就会产生错误。该函数会把src的‘\0’也复制过去,并返回第一个参数的副本。下面要自己去实现该函数:
char* strcpy(char* dst, const char* src)
{
//保证函数参数的正确性
if (dst == NULL || src == NULL)
return NULL;
char* ret = dst;
while ((*dst++ = *src++) != '\0')
;
return ret; //返回目标字符串
}
//将src字符串部分拷贝到dst当中去
char* strcpy(char* dst, const char* src, int len )
{
char* ret = dst;
while (len-- && (*dst++ = *src++) != '\0') {
;
}
return ret; //返回目标字符串
}
//示例
char* a[30];
char* b[] = "123456"
strcpy(a, b);
第一个函数是将src全部拷贝过去,第二个函数是将src部分拷贝过去。dst++和src++里面的++是后置自增运算符,代表先完成赋值运算,再进行自增,并且赋值运算符返回就是成功赋的值,所以可以拿来做判断。当*dst = *src = ‘\0’时,才会跳出循环,所以这里成功把’\0’拷贝过去了,这一步很重要。如果dst缺少一个‘\0’,调用printf函数或者sizeof函数之类时候就会出现问题。
第二个函数在前面新增了长度len的判断,每进行一次拷贝,len的数值就减1,直到减到零不满足判断条件。这里隐藏着第二个意思,也就是当src的长度小于len,首先不满足的是后面那个条件。
2.strcat拼接函数
#include<string.h>
char* strcat(char *dst,char const *src);
char* strcat(char* dst, const char* src)
{
//保证函数参数的正确性
if (dst == NULL || src == NULL)
return NULL;
char* ret = dst;
while (*dst != '\0') //循环结束后,dst指向‘\0’
dst++;
while ((*dst++ = *src++) != '\0');
return ret; //返回目标字符串
}
//示例
char* a[30] = "abc";
char* b[] = "123456"
strcat(a, b);
该函数与拷贝函数大致相同,只是前面通过循环,先把dst指针指向dst字符数组的‘\0’,后面的赋值就会把这个覆盖掉,拼接src的字符进来。
3.字符串截取函数
char* substr(char* dst, const char* src, int start, int len)
{
//保证函数参数的正确性
if (dst == NULL || src == NULL)
return NULL;
char* ret = dst;
while (start--) //循环结束后,dst指向start
src++;
while (len-- && (*dst++ = *src++) != '\0');
return ret; //返回目标字符串
}
C++语言自带substr函数,也就是截取字符串。函数参数start代表截取的起始位置,len代表长度。先通过循环将src指针指向start的位置,然后进行len长度的赋值。
4.字符串转int函数
int stoi(const char *s) {
int ret = 0;
int flag = 1;
if(*s == '-') {
flag = -1;
s++;
}
while(*s != '\0') {
ret = ret*10 + *s - '0';
s++;
}
return flag * ret;
}
5.特别说明
不知道大家是否有此疑问?前面函数内部将src、dst不断自增,参数又是指针传递,为什么函数返回之后,src、dst还是会指向字符数组的初始位置。这里涉及到函数的值传递和指针传递,实质上指针传递也是值传递的一种,只是我们传递的是指针的值。比如存在一个指针p = 0x0000a指向变量a,当p作为函数的参数,传递的值就是这个0x0000a,在函数内部编译器自动新建了一个副本p2保存0x0000a,我们可以通过p2去修改变量a的值。但是我们去修改p2指针本身的值,实质上修改的是副本的值,所以当函数结束之后,副本自动销毁,原来的p依旧没有发生改变。