字符串函数(第二篇)
一、strncpy
1、strncpy的使用
char * strncpy ( char * destination, const char * source, size_t num );
• 拷贝num个字符从源字符串到目标空间
• 如果字符串的长度小于num,则拷贝完字符串字后,在目标的后边追加0,直到num个
代码:
//strncpy
int main()
{
char arr1[10] = "abcde";
char arr2[20] = { 0 };
strncpy(arr2, arr1, 3);
return 0;
}
结果:arr1 中的 abc 被拷贝到了 arr2 中
2、strncpy的模拟实现
从arr1中拷贝num个字符到arr2中,最后返回arr2的地址
代码:
//strncpy的模拟实现
char* my_strncpy(char* dest, const char* src, size_t num, int len)
{
char* ret = dest;
assert(dest && src);
//当要拷贝的字符数量num小于字符个数len
if(len >= num)
{
while (num--)
{
*dest++ = *src++;
}
}
//当要拷贝的字符数量num大于字符个数len
else
{
while (len--)
{
*dest++ = *src++;
num--;
}
for (int i = 0; i < num; i++)
{
*dest = '\0';
dest++;
}
}
return ret;
}
int main()
{
char arr1[10] = "abcde";
char arr2[20] = "********************";
int len = strlen(arr1);
my_strncpy(arr2, arr1, 10, len);
printf("%s\n", arr2);
return 0;
}
二、strncat
1、strncat的使用
char * strncat ( char * destination, const char * source, size_t num );
• 将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加一个\0 字符
• 如果source指向的字符串的字符个数小于num,,只会将字符串中到\0 的内容追加到destination指向的字符串末尾
代码:
//strncat
int main()
{
char arr1[20] = "*****";
char arr2[10] = "abcde";
strncat(arr1, arr2, 3);
return 0;
}
2、strncat的模拟实现
从arr2中取出num个字符拼接到arr1的后面,最后返回arr1的地址
代码:
//strncat的模拟实现
char* my_strncat(char* dest, const char* src, size_t num, int len)
{
char* ret = dest;
assert(dest && src);
//遍历找到\0
while (*dest != '\0')
{
dest++;
}
//当要拼接的字符个数num <= len
if (num <= len)
{
while (num--)
{
*dest++ = *src++;
}
}
//当要拼接的字符个数num > len
else
{
while (*src != '\0')
{
*dest++ = *src++;
}
*dest = '\0';
}
return ret;
}
int main()
{
char arr1[20] = "*****";
char arr2[10] = "abcde";
int len = sizeof(arr2) / sizeof(arr2[0]);
my_strncat(arr1, arr2, 8, len);
printf("%s\n", arr1);
return 0;
}
三、strncmp
1、strncmp的使用
int strncmp ( const char * str1, const char * str2, size_t num );
• 比较str1和str2的前num个字符,如果相等就继续往后比较,最多比较num个字母,如果提前发现不一样,就提前结束,大的字符所在的字符串大于另外一个。如果num个字符都相等,就是相等返回0;
• 当第一个字符串大于第二个字符串,返回一个大于0的数;
• 当第一个字符串小于第二个字符串,返回一个小于0的数;
• 当第一个字符串等于第二个字符串,返回0;
• 比较对应字符的大小,实际上就是比较对应字符的ASCII值的大小
代码:
//strncmp
int main()
{
char str1[] = "abcdef";
char str2[] = "abcdq";
int ret = strncmp(str1, str2, 6);
printf("%d\n", ret);
return 0;
}
运行结果:
结果小于0,说明第一个字符串小于第二个字符串
2、strncmp的模拟实现
代码:
//strncmp的模拟实现
int my_strncmp(const char* p1, const char* p2, size_t num)
{
assert(p1 && p2);
//对应位置比较,相等指针向后移动,直到对应位置不相等
while (num-- && *p1 && *p2)
{
//判断
if (*p1 > *p2)
{
return 1;
}
if (*p1 < *p2)
{
return -1;
}
p1++;
p2++;
}
return 0;
}
int main()
{
char str1[] = "abcdgf";
char str2[] = "abcdq";
int ret = my_strncmp(str1, str2, 5);
printf("%d\n", ret);
return 0;
}
四、strstr
1、strstr的使用
char * strstr ( const char * str1, const char * str2);
• 函数返回字符串str2在字符串str1中第一次出现的位置
• 字符串的比较匹配不包含\0 字符,以\0 作为结束标
代码:
//strstr
int main()
{
char str1[] = "abcdefabdeg";
char str2[] = "deg";
char* ret = strstr(str1, str2);
if (ret == NULL)
{
printf("不存在\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}
代码实现结果:
2、strstr的模拟实现
代码:
//strstr的模拟实现
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* s1 = NULL;
const char* s2 = NULL;
const char* cur = str1;
if (*str2 == '\0')
{
return str1;
}
while (*cur)
{
s1 = cur;
s2 = str2;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cur;
}
cur++;
}
return NULL;
}
int main()
{
char str1[] = "abcdefabdeg";
char str2[] = "deg";
char* ret = my_strstr(str1, str2);
if (ret == NULL)
{
printf("不存在\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}
这类问题画图可以很好的帮助理解!
以上就是关于字符串函数的全部内容啦!
如果有收获的话点个赞鼓励鼓励吧!
发现任何问题或者有疑问欢迎私信联系一起探讨!