微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在不使用其他数组的情况下交换 C 中指针字符串数组中的两个字符串?

如何解决如何在不使用其他数组的情况下交换 C 中指针字符串数组中的两个字符串?

int main(){

char* ants[5]={"red ant","blue ant","green ant","yellow ant","white ant"};

.... }

如果我想交换 "red ant""white ant" ,如何交换两个字符串? 有人可以帮我写代码吗(根本不使用另一个数组)???

解决方法

用于 ants 类型的字符串是 String-Literals 并且在所有但不符合标准的编译器上都是只读的(非可变的)。字符串文字具有 字符数组 类型,长度设置为包含字符和 '\0'(空终止字符)。字符串文字的标准部分是 C11 Standard - 6.4.5 String literals

您不能更改字符串文字的内容,但您可以更改哪个指针指向哪个字符串文字。在您的情况下,您有:

    char *ants[5]={"red ant","blue ant","green ant","yellow ant","white ant"};

类型为指针数组 char。所以你有一个字符指针数组。数组中的每个指针都保存 ants 中字符串之一的地址。要更改 ants 中字符串的顺序,您必须swap 数组中指针保存的地址。

交换红色和蓝色蚂蚁的一个简单示例可能是:

#include <stdio.h>

int main(){

    char *ants[5]={"red ant","white ant"};
    int n = sizeof ants / sizeof *ants;         /* number of ants */
    
    char *t = ants[0];                          /* temp pointer holding 1st address */
    ants[0] = ants[1];                          /* assign 2nd address to 1st pointer */
    ants[1] = t;                                /* assign temp pointer to 2nd */
    
    for (int i = 0; i < n; i++)                 /* output swapped ants */
        puts (ants[i]);
}

示例使用/输出

$ ./bin/swap_ants
blue ant
red ant
green ant
yellow ant
white ant

如果你想写一个 swap() 函数来交换指针,你不能只将指针作为参数传递,例如,你不能写:

swap (char *a,char *b)

然后在函数中交换 ab。为什么?指针ab 是实际指针的副本。它们是 swap() 函数的局部变量。因此,您在函数中对它们所做的任何事情都不会在 main() 中返回。

您可以提供指针的地址作为参数,然后交换这两个地址处的指针,更改将在 main() 中看到。通过传递原始指针的实际地址,对原始地址处的值所做的任何更改都会在 main() 中返回。所以一个用于两个指针的 swap() 函数可以写成:

/** swap pointers,changing pointer at address */
void swapptr (char **a,char **b)
{
    char *t = *a;           /* pointer at a's address saved in t */
         *a = *b;           /* assign pointer from b to a */
         *b = t;            /* assign temp pointer t to b */
}

现在如果你想交换红色和蓝色蚂蚁,你可以简单地调用 swapptr() 函数传递每个指针的地址,例如

#include <stdio.h>

/** swap pointers,char **b)
{
    char *t = *a;           /* pointer at a's address saved in t */
         *a = *b;           /* assign pointer from b to a */
         *b = t;            /* assign temp pointer t to b */
}

int main(){

    char *ants[5]={"red ant","white ant"};
    int n = sizeof ants / sizeof *ants;         /* number of ants */
    
    swapptr (ants,ants + 1);
    
    for (int i = 0; i < n; i++)                 /* output swapped ants */
        puts (ants[i]);
}

(相同的输出)

注意:您必须注意类型。 ants(即 ants+0)和 ants + 1 是指向字符串文字的指针,它们是指向字符数组的指针。但是在访问时,C 中的 Type 数组被转换为指向第一个元素的指针。 C11 Standard - 6.3.2.1 Other Operands - Lvalues,arrays,and function designators(p3) 所以每一个和是一个指向的指针,一个指向每个字符的第一个字符。所以每个元素都以 char** 类型开始。所以这就是为什么你可以通过 ants + 0,ants + 1 来交换第一个和第二个(红色和蓝色)蚂蚁。

检查一下,如果您还有其他问题,请告诉我。

,

据我所知,char* 是指向地址记录的指针。 因此,如果您定义 char *temp; 并使用此变量来存储指向 ants[0] 的指针,从技术上讲,您并没有创建不同的数组来创建新订单。

char *temp;

temp=ants[0];
ants[0]=ants[4];
ants[4]=temp;

然后交换位置...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。