目录:
strncpy、strncat、strncmp函数与strcpy、strcat、strcmp函数非常相似,实现的功能也差不多。但strncpy、strncat、strncmp函数要比strcpy、strcat、strcmp函数更安全。因为在c语言string库中,strcpy,strcat,strcmp这三个函数是通过自身的长度来终止循环的,在一些条件下很不安全,比如:在strstr函数中,给arr自身后面追加arr,程序就会崩溃。
因此,就又引入了strncpy、strncat、strncmp这几个函数,这几个函数是比strcpy,strcat,strcmp多一个参数,size_t count,该参数表示字节,也就是可以限制拷贝的字节数,并且一般情况下,strncpy、strncat、strncmp这几个函数是以’\0’来终止循环的,这样就避免了程序找不到终止条件,从而崩溃掉的现象。并且strncpy、strncat函数会自动在最终结果的末尾加上’\0’。
strncpy函数
#include <stdio.h>
#include <assert.h>
#include <string.h>
char *my_strncpy(char *dest, char *str, int count)
{
char *ret = dest;
assert(dest && str);
while (count-- && *str)
{
*dest++ = *str++;
}
while (count >= (int)strlen(str))
{
*dest = '\0';
dest++;
count--;
}
return ret;
}
int main()
{
char arr1[100] = "asdsadvsvawewefaw";
char arr2[] = "hello world";
printf("%s\n", strncpy(arr1, arr2, strlen(arr2)));
return 0;
}
结果:hello world
strncat函数
#include <stdio.h>
#include <assert.h>
#include <string.h>
char *my_strncat(char *dest, const char *str, int count)
{
char *ret = dest;
assert(dest && str);
while (*dest)
{
dest++;
}
while (count-- && *str)
{
*dest++ = *str++;
}
*dest = '\0';
return ret;
}
int main()
{
char arr1[100] = "abcdef";
char arr2[] = "ghijk";
printf("%s\n", my_strncat(arr1, arr2, strlen(arr2)));
return 0;
}
结果:abcdefghijk
strncmp
#include <stdio.h>
#include <assert.h>
#include <string.h>
int my_strncmp(const char *dest, const char *str, int count)
{
assert(dest && str);
while (count--)
{
if (*dest == *str)
{
dest++;
str++;
}
else
{
if (*dest > *str)
{
return 1;
}
else
{
return -1;
}
}
}
return 0;
}
int main()
{
char arr1[] = "hello";
char arr2[] = "hello";
printf("%d\n", my_strncmp(arr1, arr2, strlen(arr1)));
return 0;
}
结果:0
strrchr
strchr查找字符串s中首次出现字符c的位置,返回首次出现c的位置的指针
strrchr查找字符串s中最后一次出现字符c的位置,返回最后一次出现c的位置的指针
#include <stdio.h>
#include <assert.h>
#include <string.h>
char *my_strrchr(char *str, char c)
{
char *ret = NULL;
assert(str);
int count = strlen(str);
while (count--)
{
if (*(str + count) == c)
{
ret = str + count;
return ret;
}
}
return 0;
}
int main()
{
char arr1[] = "abbcdefbbdeefg";
char c = 'b';
printf("%s\n", my_strrchr(arr1, c));
return 0;
}
结果:bdeefg
实际上strncpy、strncat、strncmp函数的代码基本上没变,只是判断条件变了。只有能够知道函数的实现原理,明白函数的功能,在模拟实现的时候才会简单一点