编写字符串反转函数的5种方法

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


char *strrev1(const char *str)
{
int i;
int len = strlen(str);
char *tmp = malloc(sizeof(char) * (len+1));//分配堆内存,多一个字节存放'\0'
if (tmp == NULL)
{
printf("malloc is failed\n");
return NULL;
}

//初始化堆内存为0

memset(tmp, 0, sizeof(len+1));


strcpy(tmp, str);


//遍历字符串,将第一个字符和最后一个交换,第二个和最后第二个交换,依次循环

for(i = 0; i < len/2; i++)
{
char c = tmp[i];
tmp[i] = tmp[len-i-1];
tmp[len-i-1] = c;
}


return tmp;
}


//通过指针交换

char *strrev2(const char *str)
{
char *tmp = malloc(strlen(str)+1);
memset(tmp, 0, (strlen(str)+1));
strcpy(tmp, str);
char *ret = tmp;
char *p = tmp + strlen(str) - 1;


while (p > tmp)
{
char t = *tmp;
*tmp = *p;
*p = t;


--p;
++tmp;
}


return ret;
}


//考虑时间和空间的优化,交换字符串的优化算分,通过异或运算符来交换字符串

char *strrev3(const char *str)
{
char *tmp = malloc(strlen(str)+1);
memset(tmp, 0, (strlen(str)+1));
strcpy(tmp, str);
char *ret = tmp;
char *p = tmp + strlen(str) - 1;


while (p > tmp)
{
*p ^= *tmp;
*tmp ^= *p;
*p ^= *tmp;


--p;
++tmp;
}


return ret;
}



//考虑时间和空间的优化,交换字符串的优化算分,通过数学运算符来交换字符串
char *strrev4(const char *str)
{
char *tmp = malloc(strlen(str)+1);
memset(tmp, 0, (strlen(str)+1));
strcpy(tmp, str);
char *ret = tmp;
char *p = tmp + strlen(str) - 1;


while (p > tmp)
{
*p = *p + *tmp;
*tmp = *p-*tmp;
*p = *p-*tmp;


--p;
++tmp;
}


return ret;

}



char *strrev(const char *str)
{
char *p, *_p;
const char *_str;
int len, i;
if (str == NULL)
{
printf("str == NULL\n");
return NULL;
}


//测试源字符串的长度

len = strlen(str);

//在堆中分配内存,len+1表示为最后一个字节为‘\0’
p = (char*)malloc(sizeof(char)*(len+1));
if (p == NULL)
{
printf("malloc memory is failed\n");
return NULL;
}


_p = p;


//初始化堆内存

memset(p, 0, sizeof(len+1));


//循环到字符的结尾‘\0’处

_str = str;
while (*_str != '\0')
{
 _str++;
}


--_str;

//拷贝字符串操作

for(i = len; i > 0; i--)
{
*p = *_str;
p++;
_str--;
}


//返回堆内存

return _p;
}




int main()
{
char *str = "12878883789546";


printf("str:%s\n", str);
char *_str = strrev4(str);


printf("_str:%s\n", _str);


free(_str);


return EXIT_SUCCESS;
}

























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值