交换函数的字符串交换

时间:2012-07-28 19:13:36

标签: c string pointers

我已经编写了交换字符串的代码,但我无法交换。问题是什么?如何使用函数swap

来解决它
#include <stdio.h>

void swap( char*,char*);
int main()
{
    char *ptr[2] = {"hello", "morning"};
    swap(ptr[0], ptr[1]);
    printf("%s %s", ptr[0], ptr[1]);
    return 0;
}

void swap(char *t1, char*t2)
{
    char *t;
    t = t1;

    t1 = t2;
    t2 = t;
}

我还尝试传递(&ptr[0], &ptr[1]),但此处显示的是segmentation fault。我还制作了一个字符*p1 = ptr[0], char *p1 = ptr[1],然后将&p1&p2传递给swap,但我仍然遇到了分段错误。

4 个答案:

答案 0 :(得分:7)

C函数参数是按值传递的。您将地址的值传递给swap函数,并期望这些值(地址)发生变化。但只有swap函数中地址的副本会发生变化。

要更改实际传入的地址,您需要一个附加级别的引用:

void swap(char **t1, char **t2)
{
    char *t;

    t = *t1;
    *t1= *t2;
    *t2 = t;
}

并按照swap

调用此swap(&ptr[0], &ptr[1]);

答案 1 :(得分:5)

您需要将指针传递给char数组的指针才能切换它们。通过这样做,您可以交换这些指针的值。 (哪些是实际的数组。)

#include<stdio.h>
void swap( char**,char**);
int main()
{
        char *ptr[2] = {"hello","mornig"};
        swap(&ptr[0], &ptr[1]);
        printf("%s %s",ptr[0], ptr[1]);
        return 0;
}

void swap( char **t1,char **t2)
{
        char *t;
        t = *t1;

        *t1 = *t2;
        *t2 =t;
}

答案 2 :(得分:3)

您需要将指针传递给字符串以交换它们(char **)。否则,您所做的更改将是交换功能的本地更改。

void swap( char **t1,char **t2)
{
        char *t;
        t = *t1;

        *t1 = *t2;
        *t2 =t;
}

int main()
{
        char *ptr[2] = {"hello","mornig"};
        swap(&ptr[0], &ptr[1]);
        printf("%s %s",ptr[0],ptr[1]);
        return 0;
}

答案 3 :(得分:1)

char *ptr[2] = {"hello","mornig"}; - 此语句表示您正在分配一个大小为2的数组,该数组将存储两个字符串的地址(即char *)。现在,您提供的两个字符串将位于text segment中,这是一个只读数据。如果我们试图修改它,这将导致崩溃(分段错误)。

因此,如果您致电swap(&ptr[0], &ptr[1])导致崩溃。因为您试图在第一个只读字符串m中编写字符h。无法写入text segment中的字符串。

如果您只想交换一个字符串,可以将该函数称为swap(&ptr[0], &ptr[1]),这相当于swap((ptr + 0),(ptr + 1));

并按以下方式更改交换功能

void swap( char **t1,char **t2)
{
        char *t;

        t = *t1;
        *t1 = *t2;
        *t2 =t;
}

这里我们只是交换存储在数组指针ptr中的字符串的地址。