XY

没有任何借口
posts - 9, comments - 31, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

反转字符串

Posted on 2008-06-04 16:22 路缘 阅读(8330) 评论(2)  编辑 收藏 引用 所属分类: C/C++
题目:
        编写函数reverse_string,它的原型如下:
            void reverse_string(char *str);
         函数把参数字符串中的字符串反向排列。请使用指针而不是数组下标,不要使用任何C函数库中用于操纵字符串的函数。提示:不要声明一个局部数组来临时存储参数字符串。
         
算法:
       关于反转字符串的方法很多。这里我给出我想到的一种算法。
     
/************反转字符串************/
void reverse_str(char *str)
{
    
char *cp = str;
    
int i=0;
    
while(*str!= '\0')
    
{
        str
++;
        i
++;
    }


    i 
/= 2;
    str
--;
    
while(i-- > 0)
    
{
        
*str ^= *cp;
        
*cp ^= *str;
        
*str ^= *cp;

        str
--;
        cp
++;
    }

}

说明:
         算法中运用了:a ^ a = 0  和 a ^ 0 = a 的特性。以此来进行变量值的交换,可以避免使用额外的临时变量。

Feedback

# re: 反转字符串  回复  更多评论   

2012-11-15 22:28 by 周翀
三次异或可以互换两个值,也可以毁掉两个值,当它们相等的时候……

# re: 反转字符串  回复  更多评论   

2017-09-29 22:46 by 路缘
@周翀
刚一看,吓我一跳,以为一直认为的解法有问题。细想一下,值相等也无妨。当毁掉其中一个值后,再做异或,另一个值就会得到保留,做第3次计算,毁掉的那个值也被恢复了,所以没有问题。

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理