如何在不使用其他数组的情况下交换 C 中指针字符串数组中的两个字符串?
how can I swap two strings in a string-array of pointers in C without using other arrays?
int main(){
char* ants[5]={"red ant" ,"blue ant" ,"green ant" ,"yellow ant" ,"white ant"};
.... }
如果我想交换 "red ant"
和 "white ant"
如何交换两个字符串?
谁能帮我写代码(完全不用另一个数组)???
据我所知,char* 是指向地址记录的指针。
因此,如果您定义 char *temp;
并使用此变量存储指向 ants[0] 的指针,从技术上讲,您并没有创建不同的数组来创建新订单。
char *temp;
temp=ants[0];
ants[0]=ants[4];
ants[4]=temp;
并且位置互换...
用于 ant 类型的字符串是 String-Literals 并且除了不符合规范的编译器外,所有的编译器都是只读的(不可变的)。字符串文字的类型为 字符数组 ,其长度设置为包含字符和 '[=16=]'
(空终止字符)。字符串文字的标准部分是 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" ,"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]);
}
例子Use/Output
$ ./bin/swap_ants
blue ant
red ant
green ant
yellow ant
white ant
如果你想写一个 swap()
函数来交换指针,你不能只将指针作为参数传递,例如,你不能写:
swap (char *a, char *b)
然后在函数中交换a
和b
。为什么?指针 a
和 b
是实际指针的 副本 。它们是 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 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3) 所以每个 and 都是一个 指向 的指针 指向 每个中第一个字符的 指针。所以每个元素的开头都是 char**
类型。所以这就是为什么你可以通过 ants + 0, ants + 1
来交换第一只和第二只(红色和蓝色)蚂蚁。
检查一下,如果您还有其他问题,请告诉我。
int main(){
char* ants[5]={"red ant" ,"blue ant" ,"green ant" ,"yellow ant" ,"white ant"};
.... }
如果我想交换 "red ant"
和 "white ant"
如何交换两个字符串?
谁能帮我写代码(完全不用另一个数组)???
据我所知,char* 是指向地址记录的指针。
因此,如果您定义 char *temp;
并使用此变量存储指向 ants[0] 的指针,从技术上讲,您并没有创建不同的数组来创建新订单。
char *temp;
temp=ants[0];
ants[0]=ants[4];
ants[4]=temp;
并且位置互换...
用于 ant 类型的字符串是 String-Literals 并且除了不符合规范的编译器外,所有的编译器都是只读的(不可变的)。字符串文字的类型为 字符数组 ,其长度设置为包含字符和 '[=16=]'
(空终止字符)。字符串文字的标准部分是 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" ,"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]);
}
例子Use/Output
$ ./bin/swap_ants
blue ant
red ant
green ant
yellow ant
white ant
如果你想写一个 swap()
函数来交换指针,你不能只将指针作为参数传递,例如,你不能写:
swap (char *a, char *b)
然后在函数中交换a
和b
。为什么?指针 a
和 b
是实际指针的 副本 。它们是 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 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3) 所以每个 and 都是一个 指向 的指针 指向 每个中第一个字符的 指针。所以每个元素的开头都是 char**
类型。所以这就是为什么你可以通过 ants + 0, ants + 1
来交换第一只和第二只(红色和蓝色)蚂蚁。
检查一下,如果您还有其他问题,请告诉我。