如何使字符串数组与交换函数交换它的组件?

Posted

技术标签:

【中文标题】如何使字符串数组与交换函数交换它的组件?【英文标题】:How I can make a string array interchange it's components with a swap function? 【发布时间】:2019-06-29 06:40:04 【问题描述】:

问题是这段代码不会交换这两个字符串。我是编程新手,但我可以说问题在于交换功能,但我不知道如何解决它。

我尝试在 swap 中添加 strcpy 而不是“=”,但没有奏效。

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

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

int main() 
    char *s[2] = "Hello", "World";
    swap(s[0], s[1]);
    printf("%s\n%s", s[0], s[1]);
    return 0;

【问题讨论】:

不要忘记,在 C 中,所有函数参数都是按值传递的,这意味着它们的值是被复制的。当您更改副本时,原件不会更改。做一些关于在C中模拟通过引用传递的研究。 【参考方案1】:

您想在这里使用 out 参数,并且由于您的字符串表示为指针,因此您需要指向指针的指针:

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

这样称呼它:

swap(&s[0], &s[1]);

我尝试在 swap 中添加 strcpy 而不是“=”,但没有奏效。

这不起作用的原因是字符串实际上存储在程序的二进制文件中,因此无法修改,而使用strcpy,您可以覆盖它们。如果您将它们复制到堆栈或堆中,则可以使用strcpy 进行交换。当然,这比仅仅交换指针效率要低,但这就是它的样子:

void swap(char *t1, char *t2) 
    char buf[16]; // needs to be big enough to fit the string
    strcpy(buf, t1);
    strcpy(t1, t2);
    strcpy(t2, buf);

您还需要将s 的定义更改为类似于

char s[2][16] =  "Hello", "World" ; // strings are copied to the stack now

【讨论】:

非常感谢您的回复!【参考方案2】:

仔细检查类型。

作为数组成员,你得到的是指针(指向字符串文字的起始元素)。您需要以某种方式交换成员,以便它们指向另一个字符串文字。因此,您需要自己更改这些指针。

因此,您需要将指针传递给这些指针,然后从被调用函数中进行更改。

做一些类似的事情

swap(&(s[0]), &(s[1]));

然后,在被调用函数中:

void ptrSwap(char **t1, char **t2) 
    char *temp;
    temp=*t1;
    *t1=*t2;
    *t2=temp;

加分项:有意义地命名您的函数(以及变量,只要适用)。

【讨论】:

非常感谢您的回复!【参考方案3】:

您需要传递指针的指针,即数组中字符串所在位置的地址,以便您可以在那里交换并放置正确的地址。

试试下面的代码:

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

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

int main() 
    char *s[2] = "Hello", "World";
    swap(&s[0], &s[1]);
    printf("%s\n%s", s[0], s[1]);
    return 0;

输出:

World
Hello

【讨论】:

非常感谢您的回复!

以上是关于如何使字符串数组与交换函数交换它的组件?的主要内容,如果未能解决你的问题,请参考以下文章

array_flip() 函数,一维数组,键名和键值交换..

array_flip() 函数,一维数组,键名和键值交换..

与zend(多维数组)交换数据

如何交换字符串数组中的值?

如何交换字符数组的两个字符?在 c [关闭]

Ruby - 比较数组和交换索引