0
点赞
收藏
分享

微信扫一扫

字符串函数及模拟实现

字符串函数 
  1. unsigned int ​strlen​(const char* str): 字符串长度函数;
  2. int ​strcmp​(const char* str1,const char* str2): 字符串比较函数,大于返回正数,小于返回负数,等于返回零;
  3. char* ​strcpy​(char* dest, const char* src):字符串复制函数,后者复制到前者中;
  4. char* ​strcat​(char* dest, const char* src): 在字符串后面追加另一个字符串,例如,字符串char *dest = “hello ”,char* src = "world";使用strcat(*dest,* src)后, *dest -> “hello world”;
  5. char* strstr(const char* str1, const char* str2): 在字符串str1中查找str2,若有,返回该字符串首字符的地址;无则返回NULL
字符串长度受限制函数
  1. char* ​strncpy​( char* str1,const char* str2,unsigned int i): 将str2中的前i个字符复制到str1中。
  2. int ​strncmp​(const char* str1, const char* str2, unsigned int i): str1中的前 i 个字符与str2中的前 i 个字符进行比较,返回值与strcmp一样
  3. char* ​strncat​(char* dest , const char* src , unsigned int i): 将str2中前 i 个字符追加到str1后面。

用字符串函数时需引用 <string,h> 头文件

strlen函数及其实现
strlen函数及其实现

#include <stdio.h>
#include <string.h>
#include <assert.h>//实现断言所需的库函数

//模拟实现
unsigned int my_strlen(const char* str)
{
assert(*str);//判断是否为空
int count = 0;//作为计算长度的值
while(*str++)
{
count++; //当*str不为空时,自加,并且长度count加一
} //当*str指向'\0'时,退出循环,并且返回count值
return count;
}


int main()
{
char arr[] = "abcdef";
//int ret = strlen(arr);
int ret = my_strlen(arr);
printf("%d\n",ret);

return 0;
}

字符串函数及模拟实现_字符串


字符串函数及模拟实现_字符串_02


strcmp函数及其模拟实现
strcmp函数及其模拟实现

#include <stdio.h>
#include <string.h>
#include <assert.h>

int my_strcmp(const char* str1, const char* str2)
{
assert(*str1 && *str2);//判断*str1 和*str2 是否为空
while(*str1++ == *str2++)
{
;
}//若*str1与*str2相等,则继续比较下一个,否则退出循环
if(*str1 > *str2)
{
return 1;
}
else if(*str1 < *str2)
{
return -1;
}
else
{
return 0;
}//当*str1与*str2不相等时,进行比较,*str1 > *str2 返回 1(其他正值也可)
//*str1 < *str2 返回-1(其他负值也可),等于时返回 0 ;
}


int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcdfg";
int ret = strcmp(arr1, arr2);
if(ret > 0)
{
printf("arr1 > arr2");
}
else if(ret < 0)
{
printf("arr1 < arr2");
}
else
{
printf("arr1 = arr2");
}
return 0;
}

字符串函数及模拟实现_字符串函数_03

strcpy函数及其模拟实现
//strcpy函数及其模拟实现

#include <stdio.h>
#include <string.h>
#include <assert.h>

char* my_strcpy(char* dest,const char* src)
{
assert(*dest && *src);//判断是否为空
char* p = dest;
while(*p++ = *src++)
{
;
}
*p = *src;//最后将'\0'放入
return dest;

}

int main()
{
char arr1[] = "zhang";
char arr2[] = "wang";
strcpy(arr1, arr2);//将arr2中的字符串复制到arr1中
char* p = strcpy(arr1, arr2);//可采用第一种,也可以返回指针
//打印的话可以直接打印arr1数组,
//如果采用第二种,也可以打印从指针p开始的字符串

//字符串复制模拟实现
my_strcpy(arr1, arr2);

printf("%s\n", arr1);
printf("%s\n", p);
return 0;
}

字符串函数及模拟实现_字符串_04


strcat函数及其模拟实现
//strcat函数及其模拟实现

#include <stdio.h>
#include <string.h>
#include <assert.h>

char* my_strcat(char* dest, const char* src)
{
assert(*dest && *src);
char* p = dest;
while(*p)
{
*p++;//当p不为空时,指向下一个字符,直到遇见'\0'停止
}
while(*src)
{
*p++ = *src++;//将字符串arr2中的字符诸葛追加到arr1中
}
*p = *src;//将'\0'赋值到最后,作为停止字符
return dest;

}

int main()
{
char arr1[20] = "hello ";//要开多些空间,防止追加字符时越界访问
char arr2[] = "world";
//strcat(arr1, arr2);
//char* p = strcat(arr1, arr2);
//同样的,与 strcpy相同,也可以返回指针
char *p = my_strcat(arr1, arr2);
printf("%s\n",arr1);
printf("%s\n",p);

return 0;
}

字符串函数及模拟实现_字符串函数_05

strstr函数及其模拟实现

//strstr函数及其模拟实现

#include <stdio.h>
#include <string.h>
#include <assert.h>

char* my_strstr(const char* str1, const char* str2)
{
assert(*str1 && *str2);//判断是否为空
char* s1 = NULL;
char* s2 = NULL;
char* p = str1;
if (*str2 == '\0')
{
return (char*)s1;
}
while(*p)
{
s1 = p;
s2 = str2;
while(*s1 && *s2 && (*s1 == *s2))//当*s1和s2不为空且相等时进入循环
{
s1++;
s2++;
}
if(*s2 == '\0')//当比较到*s2为停止字符时,说明查找成功
{
return p;//查找成功,返回首字符指针
}
p++;//查找没成功,再从下一个字符开始
}

}

int main()
{
char arr1[] = "wojiayoumao";
char arr2[] = "ayo";
//char* p = strstr(arr1, arr2);
//在字符数组arr1中查找arr2中的字符串,若存在返回该字符串首字符指针
//若不存在,返回null

char* p = my_strstr(arr1, arr2);
printf("%s\n", p);

return 0;
}

字符串函数及模拟实现_字符串函数_06

strncpy函数及其模拟实现
//strncpy函数及其模拟实现

#include <stdio.h>
#include <string.h>
#include <assert.h>

char* my_strncpy(char* dest, const char* src,unsigned int i )
{
assert(*dest && *src);
char* cp = dest;//储存要返回的首字符指针
while(i)
{
*cp++ == *src++;
i--;
}
*cp = '\0';//复制完毕,将停止字符'\0'放到最后

return dest;

}

int main()
{
char arr1[] = "aaaaaa";
char arr2[] = "bbbb";
//strncpy(arr1, arr2, 2);
//char* p = strncpy(arr1, arr2, 2);
//arr2中前两个字符(bb)复制到arr1中

char* p = my_strncpy(arr1, arr2, 2);
printf("%s\n", arr1);
printf("%s\n", p );

return 0;
}

字符串函数及模拟实现_字符串_07​​​​

strncmp函数及其模拟实现
//strncmp函数及其模拟实现

#include <stdio.h>
#include <string.h>
#include <assert.h>

int my_strncmp(const char* str1, const char* str2,unsigned int i)
{
assert(*str1 && *str2);
while((--i) && (*str1 == *str2))
{
*str1++;
*str2++;
}
if(*str1 == *str2)
{
return 0;
}
else if(*str1 > *str2)
{
return 1;
}
else
{
return -1;
}

}

int main()
{
char arr1[] = "abcdff";
char arr2[] = "abcdef";
//int ret = strncmp(arr1 , arr2, 4);
//arr1中的前4个字符与arr2中的前4个字符进行比较
//可知,arr1与arr2全部比较,最后结果是arr1 > arr2
//但是比较前四个字符的话,arr1 = arr2
int ret = my_strncmp(arr1, arr2, 4);
if(ret > 0)
{
printf("arr1 > arr2");
}
else if(ret < 0)
{
printf("arr1 < arr2");
}
else
{
printf("arr1 = arr2");
}

return 0;
}

字符串函数及模拟实现_字符串_08

strncat函数及其模拟实现
//strncat函数及其模拟实现

#include <stdio.h>
#include <string.h>
#include <assert.h>

char* my_strncat(char* dest, const char* src,unsigned int i)
{
assert(*dest && *src);
char* cp = dest;
while(*cp)
{
*cp++;
}
while((i--) && *src)
{
*cp++ = *src++;
}
*cp = '\0';
return dest;
}

int main()
{
char arr1[20] = "hello ";//同样需要定义一个大的数组,防止越界
char arr2[] = "worldworldworld";
//char* p = strncat(arr1, arr2, 5);
//将arr2中的前五个字符追加到arr1后面

char *p = my_strncat(arr1, arr2, 5);
printf("%s\n", arr1);
printf("%s\n", p );

return 0;
}

字符串函数及模拟实现_字符串_09






举报

相关推荐

0 条评论