strlen函数 strcpy函数 strcmp函数 strstr函数 strcat函数 memcpy函数 memmove函数 以及字符串反转函数的实现

本文介绍了C语言中几个常用的字符串操作函数的实现,包括字符串长度计算、复制、拼接、比较及子串查找等功能,并探讨了strcpy与memcpy的区别。


//编写一个函数计算一个字符串的长度
#include<stdio.h>
#include<stdlib.h>


//int my_strlen(char *str)
//{
// int len = 0;
// while (*str)
// {
// len++;
// str++;
// }
// return len;
//}
int my_strlen(char *str)
{
char *f = str;
while (*f)
f++;
return f - str;
}
int main()
{
char p[] = "huqingdou";
int len= my_strlen(p);
printf("字符串的长度为:%d\n", len);
system("pause");
return 0;
}




//实现my_strcpy函数
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>


void *my_strcpy(char *dst, const char *src)
{
assert(dst);
assert(src);
while (*dst++ = *src++)
;
}
int main()
{
char s[] = "huqingdou";
char d[20] = { 0 };
my_strcpy(d, s);
printf("源字符串为%s\n", s);
printf("#############\n");
printf("复制后字符串为%s\n", d);
system("pause");
return 0;
}


//实现my_strcmp函数
//比较两个字符串
//设这两个字符串为str1,str2,
//若str1 = str2,则返回零;
//若str1<str2,则返回负数;
//若str1>str2,则返回正数。


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


int my_strcmp(const char *str1, const char *str2)
{
while (*str1==*str2)
{
if (*str1 == '\0')
{
return 0;
}
++str1;
++str2;
}
return *str1 - *str2;
}
int main()
{
char *p = "huqingdouq";
char *q = "huqingdou";
printf("p字符串为:%s\n", p);
printf("q字符串为:%s\n", q);
int ret=my_strcmp(p, q);
if (ret==0)
printf("两字符串相等\n");
else if (ret > 0)
printf("p字符串大于q字符串\n");
else
printf("q字符串大于p字符串\n");
system("pause");
return 0;
}




//实现my_strstr函数
//strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。
//如果是,则该函数返回str2在str1中首次出现的地址;
//否则,返回NULL。
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>


void *my_strstr(const char *arr1, const char *arr2)
{
assert(arr1);
assert(arr2);
char *ptr = arr1;
char *p1 = NULL;
char *p2 = NULL;
while (*ptr)
{
p1 = ptr;
p2 = arr2;
while ((*p1 == *p2) && (*p2))
{
p1++;
p2++;
if (*p2 == '\0')
return ptr;
}
ptr++;
}
return NULL;
}
int main()
{
char arr1[] = "abcdefg";
char arr2[] = "cde";
printf("%s\n", my_strstr(arr1, arr2));
system("pause");
return 0;
}




//实现my_strcat函数
//将两个char类型连接。
//char d[20] = "GoldenGlobal"; char *s = "View"; strcat(d, s);
//结果放在d中
//printf("%s", d);
//输出 d 为 GoldenGlobalView (中间无空格)
//d和s所指内存区域不可以重叠且d必须有足够的空间来容纳s的字符串。
//返回指向d的指针。
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>


void *my_strcat(char *arr1, const char *arr2)
{
assert(arr1);
assert(arr2);
char *ptr = arr1;
while (*arr1)
{
arr1++;
}
while (*arr1++ = *arr2++)
;
return ptr;
}
int main()
{
char arr1[20] = "abcdefg";
char arr2[] = "cde";
printf("%s\n", my_strcat(arr1, arr2));
system("pause");
return 0;
}




//实现my_memcpy函数
//从源src所指的内存地址的起始位置开始拷贝n个字节到
//目标dest所指的内存地址的起始位置中
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>


void *my_memcpy(char *arr1, const char *arr2, int n)
{
assert(arr1);
assert(arr2);
char *ptr = arr1;
char *p1 = arr1;
char *p2 = arr2;
while (n--)
*p1++ = *p2++;
}
int main()
{   
char arr1[20]="123";
char arr2[] = "abcdefg456";
my_memcpy(arr1 + 3, arr2 + 7, 5);
printf("%s\n",arr1);
system("pause");
return 0;
}




strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。
       strcpy只能复制字符串,而memcpy可以复制任意内容,
例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,
它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。
memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,
而需要复制其他类型数据时则一般用memcpy




//实现my_memmove函数
//memmove用于从src拷贝count个字节到dest,
//如果目标区域和源区域有重叠的话,
//memmove能够保证源串在被覆盖之前将重叠
//区域的字节拷贝到目标区域中。
//但复制后src内容会被更改。
//但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void *memmove(void* arr1, const void* arr2, int count)
{
assert(arr1);
assert(arr2);
char *ptr = arr1;
char *p1 = arr1;
char *p2 = arr2;
if (p1 > p2&&p1 < p2 + count)
{
while (count--)
{
*(p1 + count) = *(p2 + count);
}
}
else
{
while (count--)
{
*p1++ = *p2++;
}
}
return ptr;
}
int main()
{   
char arr1[20]="huqingdou is a girl";
char arr2[] = "duranran ";
memmove(arr1, arr2, 8);
printf("%s\n",arr1);
system("pause");
return 0;
}




//实现字符串的反转reverse_string(char *string)函数
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void *reverse_string(char *str)
{
assert(str);
int len = 0;
int i = 0;
while (*str)
{
len++;
str++;
}
for (i = 0; i < len; i++)
{
str--;
}
i = 0;
char c;
int j = len - 1;
while (j>i)
{
c = str[i];
str[i] = str[j];
str[j] = c;
i++;
j--;
}
}
int main()
{   
char arr[20]="huqingdou";
reverse_string(arr);
printf("%s\n", arr);
system("pause");
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值