交换两个字符串指针

bas*_*ass 1 c swap

我必须在C中使用char []并且我想在它们之间交换,只需将指针交换到数组而不是一次只有一个char,所以我编写了这段代码:

#include <stdio.h>
void fastSwap (char **i, char **d)
{
    char *t = *d;
    *d = *i;
    *i = t;
}
int main ()
{
    char num1[] = "012345678910";
    char num2[] = "abcdefghujk";
    fastSwap ((char**)&num1,(char**)&num2);
    printf ("%s\n",num1);
    printf ("%s\n",num2);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到这个输出(注意最后4个字符)

abcdefgh8910
01234567ujk

当我期待:

abcdefghujk
012345678910

注意:我正在使用64位Linux系统.

Mar*_*iot 12

您不能修改的地址num1num2,你的代码应该工作,如果你的测试是不是:

int main ()
{
    char num1[] = "012345678910";
    char num2[] = "abcdefghujk";
    char *test1 = num1;
    char *test2 = num2;
    fastSwap (&test1,&test2);
    printf ("%s\n",test1);
    printf ("%s\n",test2);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • @sbi原始代码的问题是'指针'的交换实际上交换了数组的前8个字节,因为强制转换了#num1(这是一个char*)到char**. (4认同)
  • 如果它解释了为什么原始代码不起作用,而不仅仅是呈现固定代码,那么这个答案会更有用.这就是货物邪教开始的方式. (3认同)

sbi*_*sbi 7

数组不是指针.当你调用它们时它们会衰减到指针fastSwap(),这些指针不是实际的数组.你需要演员表的事实应该给你一个错误的暗示.

这可行:

void fastSwap (const char **i, const char **d)
{
    const char *t = *d;
    *d = *i;
    *i = t;
}

const char* num1 = "012345678910";
const char* num2 = "abcdefghujk";
fastSwap (&num1,&num2);
printf ("%s\n",num1);
printf ("%s\n",num2);
Run Code Online (Sandbox Code Playgroud)


Kar*_*ldt 5

这将有效:

int main ()
{
    char *num1 = "012345678910";
    char *num2 = "abcdefghujk";
    fastSwap (&num1,&num2);
    printf ("%s\n",num1);
    printf ("%s\n",num2);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)