本文共 2963 字,大约阅读时间需要 9 分钟。
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’。
#include#include #include 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
#include#include #include 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
#include#include #include 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
strchr查找字符串s中首次出现字符c的位置,返回首次出现c的位置的指针
strrchr查找字符串s中最后一次出现字符c的位置,返回最后一次出现c的位置的指针#include#include #include 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函数的代码基本上没变,只是判断条件变了。只有能够知道函数的实现原理,明白函数的功能,在模拟实现的时候才会简单一点
转载地址:http://obwdb.baihongyu.com/