目录
[1.1 strlen函数的介绍](#1.1 strlen函数的介绍)
[1.2 strlen的模拟实现(三种方式实现)](#1.2 strlen的模拟实现(三种方式实现))
[2.1 strcpy函数的介绍](#2.1 strcpy函数的介绍)
[2.3 strcpy的模拟实现](#2.3 strcpy的模拟实现)
[3.1 strcat函数的介绍](#3.1 strcat函数的介绍)
[3.2 strncat函数的介绍](#3.2 strncat函数的介绍)
[3.3 strcat函数的模拟实现](#3.3 strcat函数的模拟实现)
[4.1 strcmp 函数的介绍](#4.1 strcmp 函数的介绍)
[4.2 strncmp函数的介绍](#4.2 strncmp函数的介绍)
[5.1 strstr函数的介绍](#5.1 strstr函数的介绍)
[5.2 strstr函数的模拟实现](#5.2 strstr函数的模拟实现)
前言:
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 是长度受限制的字符串函数;
如果觉得文章不错,期待你的一键三连哦,你的鼓励是我创作的动力之源,让我们一起加油,一起奔跑,让我们顶峰相见!