字符串反转 c实现

昨天面试题中有一个关于字符串反转的,当时没实现,现在记录下:

          

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

char *strrev(char * str){
int i,len;
char *ret;

ret = (char *)malloc(sizeof(str));

len = strlen(str);

for(i=0;i<len;i++){
*(ret+i) = *(str+len-1-i);

return ret;
}

int main(){
char str[]="dsf523321a";
printf("the rev str is :%s\n",strrev(str));
return 0;
}

但是一开始,我的写法

char *strrev(char * str){

int i,len;
char *ret = str;

len = strlen(str);

for(i=0;i<len;i++){
*(ret+i) = *(str+len-1-i);
}

return ret;
}

 

//双向copy,不使用动态内存分配,仅适用于数字

char * revstr(char * string){
char *start = string;
char *left = string;
char ch;

while (*string++)   //置于字符串最后的位置
;
string -= 2;   

while (left < string)
{
ch = *left; //swap元素
*left++ = *string; //按照从后向前的顺序将string中的字符copy到left
*string-- = ch; //由于copy的过程中,会覆盖left,实现双向copy
}

return(start);
}

于是输出的结果竟然是a12333321a,靠,怎么回事?原来在 char *ret = str 相当于我给一个字符串取了两个名,然后在进行*(ret+i) = *(str+len-1-i)这个操作的时候,就是出现使用了后半部分的字符覆盖了前半部分的字符,所以,必须动态再分配一个同样大小的空间,来进行反转和临时的存放,谨记,在每声明一个变量时,需要知道你为什么这么声明,具体在使用上需要注意的地方。

posted on 2014-07-12 10:44  kivmi  阅读(476)  评论(0编辑  收藏  举报

导航