寻找高效的交换字符指针

时间:2014-12-10 18:07:05

标签: c pointers embedded swap

我的问题是关于交换字符指针算法的效率。

为什么其中一条注释行导致我的编译器抛出错误?

同样的逻辑用于交换带有temp的b,但是同样的逻辑会导致错误,同时在temp和a的相同函数中重复?

谢谢大家。

#include <iostream>
void sawp ( char *a, char *b, int l)
{
    char * prtA = a;
    char * prtB = b;
    char *temp = (char *)calloc(l, sizeof(char));

    while(*(char*)b)
    {        
        *(char*)temp= *(char*)b;
        // *(char*)b  = *(char*)a;
        // *(char*)a = *(char*)temp;

        std::cout<<*(char*)temp<<std::endl;
        b++;
        temp++;
        a++;    
    }

}

int main()

{
    char *a="Name";
    char *b="Lastname";
    sawp (a,b,sizeof(b));
    return 0;

}

4 个答案:

答案 0 :(得分:2)

修改字符串文字会导致未定义的行为。 它可能会导致崩溃。 字符串文字是只读的,因此无法修改。

所以

*b = *a;

是一个错误。

如果要修改字符串,则应具有读写权限。 所以

char a[10] = "name1";
char b[10] = "name2";

然后你可以

*b = *a; /* In your sawp() function */

答案 1 :(得分:2)

编写char *a="Name"编译器会将"Name"字符串视为常量字符串,并将其放在rom内存部分中。 rom memory部分是一个只读部分,代码无权在运行时更改它,因此当您尝试更改它时会出现分段错误。

答案 2 :(得分:0)

你看过这个条目了吗? Swapping pointers in C (char, int)

最后,有一个关于如何交换字符的解释。也许它适合你。

答案 3 :(得分:0)

为避免Gopi发布的文字问题,您可以在main中使用字符数组而不是指针,并确保它们的大小相同,例如:

char a[10] = {'N','a','m','e',0,0,0,0,0,0};
char b[10] = {'L','a','s','t','n','a','m','e',0,0};
/* ... */
    sawp(a, b, sizeof(b));

或者如果您仍想使用指针,可以使用malloc()(假设这是C而不是C ++)为字符串分配空间,然后将文字复制到您分配的字符串中。