Warm tip: This article is reproduced from serverfault.com, please click

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

(其他 - how can I swap two strings in a string-array of pointers in C without using other arrays?)

发布于 2020-12-20 00:57:46
int main(){

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

.... }

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

Questioner
nina97
Viewed
11
David C. Rankin 2020-12-20 11:22:08

用于蚂蚁类型的字符串String-Literals,在所有但不合格的编译器上,它们都是只读的(非可变的)。字符串文字具有字符类型数组,其长度设置为包含字符和'\0'(以n终止的字符)。字符串文字的标准部分是C11标准-6.4.5字符串文字

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

    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" ,"blue ant" ,"green ant" ,"yellow 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, 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 */
}

int main(){

    char *ants[5]={"red ant" ,"blue ant" ,"green ant" ,"yellow 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标准-6.3.2.1其他操作数-左值,数组和函数指示符(p3)因此,每个和都是指向每个中第一个字符指针指针因此,每个元素都具有char**开始的类型这就是为什么你可以通过ants + 0, ants + 1以交换第一和第二(红色和蓝色)蚂蚁。

仔细看一下,如果你还有其他问题,请与我联系。