5. strncpy 函数的使用和模拟实现
选择性拷贝
char * strncpy ( char * destination, const char * source, size_t num );
1.拷贝num个字符从源字符串到目标空间。
2.如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边 追加0 ,直到num个。
测试
int main()
{
char arr1[] = "abcd";
char arr2[10] = { 0 };
strncpy(arr2, arr1, 3);
printf("%s", arr2);
return 0;
}
结果:
模拟实现:
char* my_strncpy(char* dest, const char* src, size_t num)
{
char* ret = dest;//把初始地址放在ret
assert(dest && src);//两者不能为空值
while (num--)
{
*(char*) dest = *(char*) src;// 这样也行 * dest = *src; 用char* 是把进行一个字节逐步进行替换
dest++;
src++;
}
return ret;
}
int main()
{
char arr1[] = "abcd";
char arr2[10] = { 0 };
my_strncpy(arr2, arr1, 3);
printf("%s", arr2);
return 0;
}
6.strncat函数的使用和模拟实现
选择性字符串拼接 拼接后默认添加 ‘\0’
char * strncat ( char * destination, const char * source, size_t num );
1.将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字
符
2.如果source指向的字符串的⻓度小于num的时候,只会将字符串中到\0 的内容追加到destination指向的字符串末尾
测试
int main()
{
char arr1[10] = "abcd";
char arr2[10] = "efg";
strncat(arr1, arr2, 3); //在arr1后拼接arr2
printf("%s", arr1);
return 0;
}
结果:
模拟实现:
char* my_strncat(char* dest, const char* src, size_t num)
{
assert(dest && src);
char* ret = dest;
//主要是把dest遍历便 到达dest的字符串的结尾 然后把src增加到dest后面
while (*dest)
{
dest++;
}
while ((*dest++ = *src++) && num--) {
}
*dest = '\0';
return 0;
}
int main()
{
char arr1[10] = "abcd";
char arr2[10] = "efg";
my_strncat(arr1, arr2, 3); //在arr1后拼接arr2
printf("%s", arr1);
return 0;
}
7.strncmp函数的使用
比较:选择性两字符串的比较
int strncmp ( const char * str1, const char * str2, size_t num );
比较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回
int main()
{
char arr1[10] = "abcd";
char arr2[10] = "efg";
int ret=strncmp(arr1, arr2, 3); //再arr1后拼接arr2
printf("%d",ret);
return 0;
}
结果:
8.strstr 的使用和模拟实现
在一个字符串中查找一个字符串
char * strstr ( const char * str1, const char * str2)
//函数返回字符串str2在字符串str1中第⼀次出现的位置 之后的内容
测试
int main()
{
char arr1[] = "this is an apple";
const char* p = "is";
char* ret=strstr(arr1, p);
printf("%s", ret);
return 0;
}
模拟实现:
char* mystrstr(const char* str1, const char* str2)
{
//设置两个固定位置的指针
const char* s1 = NULL;
const char* s2 = NULL;
//设置要查找字符串的位置
const char* cur = str1;
//首先判断要查找的是否为空
if (*str2 == '\0')
return (char*)str1;
//进行查询
while (*cur) //当*cur!='\0'
{
s1 = cur;
s2 = str2;
//满足以下要求 否则无法查询 原字符串和被查找字符串都不能为 '\0'
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
{
s1++;
s2++; //两者遇到 同时增加
}
//当被查找的查到 '\0' 则查找完成
if (*s2 == '\0')
{
return cur;
}
cur++;
}
return NULL;
}
int main()
{
char arr1[] = "this is an apple";
const char* p = "is";
char* ret= mystrstr(arr1, p);
printf("%s", ret);
}