2014-04-20 46 views
0

我有一个关于使用XOR两个交换两个字符串文字的快速问题。使用XOR交换两个指针

,所以我有以下几点:

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


void intSwap(int *a, int *b){ 
    *a=*a^*b; 
    *b=*a^*b; 
    *a=*a^*b; 
} 


void swapString(char **a, char **b){ 
    char *temp=*a; 
    *a=*b; 
    *b=temp; 
} 

void main(){ 
    char *s= "ha"; 
    char *t= "Oh"; 

    printf("%s and %s \n",s,t); // prints ha Oh 
    swapString(&s,&t); 
    printf("%s and %s \n",s,t); // prints Oh ha 


    int a=10; 
    int b=5; 
    printf("%d %d\n",a,b); //print 10 5 
    intSwap(&a,&b); 
    printf("%d %d\n",a,b); //print 5 10 
} 

正如你所看到的,我用二进制异或运算,为intSwap。但是,当我试图用swapString做同样的事情时,它不起作用。

我得到错误信息说:无效的操作数为二进制^(具有“字符*”和“字符*”)

你知道如何使用XOR交换两个字符串文字?在C中可能吗?谢谢!

+2

我希望你不会在任何生产应用程序中使用此代码。如果你这样做,你必须添加额外的逻辑来确保调用'intSwap(&a,&a)'不会搞砸。 –

回答

3

如果您使用的是C99或更高版本,则需要在操作之前将char *投射到intptr_t,然后在投入运行后投射回char *

你的错误消息:

无效操作数为二进制^(具有“字符*”和“字符*”)

告诉你,你,而你得到了概念权,运营商^不适用于指针。请注意,如果您的目标是在不使用额外变量的情况下执行此操作(请注意,这是对现代编译器实际上更高效的而不是),您可以使用加法和减法来做到这一点,这些指针确实支持得很好。 See this site了解详情。

intptr_t是一个整数类型,旨在保存指针值。注意intptr_t不严格地说是完全可移植的(可能没有可以容纳指针的整数类型)per this SO answer

7

指针没有按位操作。唯一可以采取行动的行动是+-。所以你需要投入intptr_t并返回。

无论如何,这是一个糟糕的做法,不会为您节省任何周期。编译器将使用简单分配来识别交换并为您优化。

1

* a = * b;意味着b的一个字符将被复制到一个不是整个字符串的地方,同样适用于swapString函数,所以这会产生错误的值。

如果你尝试用字符串长度1相同,这将工作 ..Thanks Vijayky