c语言|C语言-字符串库函数详解(含部分函数的模拟实现)

面试中常常要求写一些基本的库函数,尤其以字符串库函数考的最多,本文汇总了一些常见的字符串库函数。
一般地,使用这些函数,需要包含头文件:

#include

一、strlen 函数功能:
求字符串长度的函数。
函数原型:
size_t strlen ( const char * str );

函数说明:
  • 字符串以'\0'作为结束标志,strlen函数返回的是字符串'\0'前面出现的字符个数(不包括'\0')
  • 函数的返回值为size_t,是无符号的
下面通过一个例子解释返回值是无符号这个概念:
#include #include int main() { const char* str1 = "abcdef"; const char* str2 = "bbb"; if (strlen(str2) - strlen(str1) > 0) { printf("hello\n"); } else { printf("hallo\n"); } return 0; }

结果如下:
c语言|C语言-字符串库函数详解(含部分函数的模拟实现)
文章图片

因为strlen函数的返回值是无符号的,所以strlen(str2)-strlen(str1)的结果为3,故输出的结果为hello。
模拟实现:
#include #include int my_strlen(const char *p) { assert(p); //判断指针是否为空 int count = 0; while (*p != '\0') { count++; p++; } return count; } int main() { char arr[] = "abcdef"; int ret = my_strlen(arr); printf("%d\n", ret); return 0; }

二、strcpy 字符串复制函数。
函数功能:
将源字符串拷贝到目标空间中。
函数原型:
char* strcpy(char * destination, const char * source );

函数说明:
  • 源字符串必须以'\0'结束
  • 目标空间必须可变并且足够大,从而确保可以存放源字符串
  • 拷贝时,源字符串中的'\0'会被拷贝到目标空间中
模拟实现:
#include #include char * my_strcpy(char* dest, const char* src) { assert(dest != NULL); //判断指针是否为空 assert(src != NULL); char * ret = dest; while (*dest++ = *src++) //拷贝src指向的字符串到dest指向的空间 { ; } //返回目的空间起始位置 return ret; } int main() { char arr1[] = "abcdef"; //目标空间必须足够大 char arr2[] = "bit"; my_strcpy(arr1, arr2); printf("%s\n",arr1); return 0; }

三、strcat 字符串追加函数。
函数原型:
char * strcat ( char * destination, const char * source );

函数说明:
  • 源字符串必须以'\0'结束
  • 目标空间必须可变并且足够大,从而确保可以存放源字符串
  • 追加时,是从目标空间的'\0'处开始追加
那么,字符串可以给自己 追加吗?答案是 否定的。(可以用strncat实现)
因为:
自己给自己追加时,例如字符串“abcdef”,实际上是abcdef\0,那么在自己给自己追加的时候,把a放到\0的位置,b,c,d,e,f一次放到后面,之后发现\0不在了,已经被改成a了,没有\0(没有到结束位置),没办法停止,故程序会崩溃。
模拟实现:
#include #include char * my_strcat(char* dest, const char* src) { assert(dest); assert(src); char* ret = dest; while (*dest)//找到目标字符串中'\0' { dest++; } while (*dest++ = *src++) //追加 { ; } return ret; } int main() { //在数组arr1后面追加字符串arr2 char arr1[10] = "abc"; char arr2[] = "bcd"; printf("%s\n", my_strcat(arr1, arr2)); return 0; }

四、strcmp 字符串比较函数。
函数说明:
  • 通过比较字串中各个字符的ASCII码,来比较参数str1和str2字符串,比较时考虑字符的大小写
  • 字符串str1大于str2,返回大于0的数字;字符串str1等于str2,返回0;字符串str1小于str2,返回小于0的数字
函数原型:
int strcmp ( const char * str1, const char * str2 );

模拟实现:
#include #include int my_strcmp(const char* dest, const char* src) { assert(dest != NULL); assert(src != NULL); while (*dest == *src) { if (*dest == '\0') { return 0; //两个字符串相等 } dest++; src++; } if (*dest > *src) { return 1; //大于 } else { return -1; //小于 } } int main() { char arr1[] = "abcdef"; char arr2[] = "abd"; int ret = my_strcmp(arr1, arr2); printf("ret=%d\n", ret); return 0; }

五、strstr 找出str1字符串在str2字符串中第一次出现的位置(不包括str1的’\0’)。
函数原型:
char * strstr ( const char *str2, const char * str1);

  • strstr 返回该位置的指针,如找不到,返回空指针。
模拟实现:
#include #include char * my_strstr(const char* dest, const char* src) { assert(dest); //判断指针是否为空 assert(src); char* ret1 = dest; char* ret2 = src; char* cur = dest; if (*src =https://www.it610.com/article/='\0') { return dest; //如果需要查找的字符串arr2为空,那么返回字符串arr1的首地址 } while (*dest) { ret1 = cur; ret2 = src; while ((*ret1 != '\0') && (*ret2 != '\0') && (*ret1 == *ret2)) { ret1++; ret2++; } if (*dest == "\0") { return ret1; } cur++; } return NULL; } int main() { char arr1[] = "abccdef"; char arr2[] = "cde"; char * ret = my_strstr(arr1, arr2); //查找arr2字符串是否在arr1字符串中 if (ret == NULL) { printf("?\n"); } else { printf("%s\n",ret); } return 0; }

六、strncpy函数原型:
char * strncpy ( char * destination, const char * source, size_t num );

函数说明:
  • 拷贝num个字符从源字符串到目标空间
  • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0('\0'),直到num个
函数实现:
#include #include int main() { char arr1[10] = "abcdef"; char arr2[] = "bit"; strncpy(arr1, arr2, 6); return(0); }

七、strncat 函数原型:
char * strncat ( char * destination, const char * source, size_t num );

函数功能:
把source所指字符串的前n个字符添加到destination结尾处(覆盖dest结尾处的’\0’),并添加’\0’ 。
函数说明:
  • source和destination所指内存区域不能重叠
  • destination必须有足够的空间来容纳source的字符串
函数实现:
#include #include int main () { char str1[20]; char str2[20]; strcpy (str1,"To be "); strcpy (str2,"or not to be"); strncat (str1, str2, 6); puts (str1); return 0; }

八、strncmp 函数原型:
int strncmp ( const char * str1, const char * str2, size_t num );

函数功能:
比较字符串str1和str2的前num个字符。
函数说明:
如果前num字节完全相等,返回值就为0;在前num字节比较过程中,如果出现*str1与*str2不等,则返回(*str1-*str2)。
【c语言|C语言-字符串库函数详解(含部分函数的模拟实现)】函数实现:
#include #include int main() { const char *p1 = "abczdef"; char *p2 = "abcqwer"; int ret = strncmp(p1, p2, 4); printf("%d\n", ret); return 0; }

    推荐阅读