前言:
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放常量字符串中或则字符数组中;字符串常量使用于那些对它不做修改的字符串函数;
一.常见函数的介绍与模拟实现
一.strlen函数
1.1 strlen函数的介绍
~字符串是以 '\0' 作为结束标志的,strlen函数返回的是字符串'\0'前面出现的字符个数(不包含'\0');
~strlen函数的参数指向的字符串必须要以'\0'结束;
~函数的返回值是size_t,是无符号(特别注意,易错);(如下代码)
分析:
strlen(str1)=3;
strlen(str2)=6;
而 3-6=-3 应该是小于0的数,运行出结果却是大于;因为strlen函数返回值是无符号的,无符号减去无符号的数,结果也被当成无符号的数,而-3当成无符号的数是一个很大的数;
1.2 strlen的模拟实现(三种方式实现)
第一种:计数器的方式
int my_strlen(const char * str) { int count = 0; while(*str) { count++; str++; } return count; }
第二种:递归的方式
int my_strlen(const char * str) { if(*str == '\0') return 0; else return 1+my_strlen(str+1); }
第三种:指针-指针的方式
int my_strlen(char *s) { char *p = s; while(*p != ‘\0’ ) p++; return p-s; }
二.strcpy函数与strncpy函数
2.1 strcpy函数的介绍
strcpy函数是将源字符串的字符一个一个进行拷贝目标空间去;
这里的strcpy函数返回值为目标空间的起始地址,方便链式访问;
如printf("%s\n",strcpy(arr1,arr2));
~源字符串必须以'\0'结束;
~会将源字符串的'\0'拷贝到目标空间;
目标空间不许足够大,以确保能存放源字符串;(如果目标空间较小时,放不下源字符串,会出错);
目标空间必须可变;
2.2strncpy函数的介绍
strncpy函数的作用与strcpy函数相似,只是在strcpy函数的基础上加上了需要拷贝的字符数,拷贝完再在末尾放个'\0';
例如:strncpy(arr1,arr2,4) 作用是将arr2中4个字符拷贝到arr1中;
strcpy(arr1,arr2) 作用是将arr2整个字符串拷贝到arr1中;
2.3 strcpy的模拟实现
char* my_strcpy(char* dest, const char* src) { char* ret = dest; //记住目标空间的起始地址 assert(dest != NULL); assert(src != NULL); while (*src!='\0') { *dest=*src; dest++; src++; } return ret; //返回目标空间的起始地址 }
三.strcat函数与strncat函数
3.1 strcat函数的介绍
~源字符串必须以'\0'结束;
~目标空间必须有足够的大,能容纳下源字符串的内容;
~目标空间必须可修改;
注意:字符串不能给自己追加字符串;
3.2 strncat函数的介绍
strncat函数的作用与strcat函数相似,只是在strcat函数的基础上加上了需要追加的字符数;追加完后再在末尾放个'\0'
例如:strcat(arr1,arr2) 作用是将arr2中整个字符串追加到arr1后面
strncat(arr1,arr2,4) 作用是将arr2中4个字符追加到arr1的后面
3.3 strcat函数的模拟实现
char* my_strcat(char* dest, const char* src) { char* ret = dest; assert(dest != NULL); assert(src != NULL); while (*dest) { dest++; } while ((*dest++ = *src++)) { ; } return ret; }
四.strcmp函数与strncmp函数
4.1 strcmp 函数的介绍
~标准规定:
如果第一个字符串大于第二个字符串,返回大于0的数字;
如果第一个字符串小于第二个字符串,返回小于0的数字;
如果第一个字符串等于第二个字符串,返回0;
怎么判断大小呢?
两个字符串内容,一个一个字符依次比较,如
str1 : " asdfgh" str2 :"asdagh"
第一个字符与第一个字符相比,相等,再比较后面的一个字符,知道遇到不同的字符或则遇到'\0'(至少一个字符串遇到'\0');
如上面的两个字符串,前三个字符都一样,比第四个,f>a
所以str1>str2 如下图
4.2 strncmp函数的介绍
strncmp函数的作用与strcmp函数相似,只是在strcmp函数的基础上加上了需要比较到的第几个字符;
例如:strcmp(arr1,arr2) 作用是将arr1整个字符串与arr2整个字符串比较
strncmp(arr1,arr2,4) 作用是将arr1中前4个字符与arr2中前4个字符比较
4.3 strcmp 函数的模拟实现
int my_strcmp(const char* str1, const char* str2) { assert(str1 != NULL); assert(str2 != NULL); while (*str1==*str2) { if (*str1 == '\0') { return 0; } str1++; str2++; } if (*str1 > *str2) return 1; else return -1; }
五.strstr函数
5.1 strstr函数的介绍
函数的作用:(字符串中找子字符串)
返回指向 str2 中第一次出现的 str1 的指针,如果 str2 不是 str1 的一部分,则返回一个空指针。
匹配过程不包括终止空字符,但它到此为止。
5.2 strstr函数的模拟实现
char * strstr (const char * str1, const char * str2) { char *cp = (char *) str1; char *s1, *s2; if ( !*str2 ) return((char *)str1); while (*cp) { s1 = cp; s2 = (char *) str2; while ( *s1 && *s2 && !(*s1-*s2) ) s1++, s2++; if (!*s2) return(cp); cp++; } return(NULL); }
总结:
1. strcpy strcat strcmp 这三个函数特别关注 '\0',不关注字符串有多长,所以这三个函数叫长度不受限制的字符串函数;
2. strncpy strncat strncmp 是长度受限制的字符串函数;
如果觉得文章不错,期待你的一键三连哦,你的鼓励是我创作的动力之源,让我们一起加油,一起奔跑,让我们顶峰相见!