c-使用strcpy交换在数组中不起作用的元素



我试图交换数组中的元素(这是非常基本的,但当我试图更改数组的索引时,它会扰乱整个数组(

#include <string.h>
#include <stdio.h>
int     main(int argc, char **argv)
{
int swap;
int position;
char temp[1000];
char *i;
swap = 1;
while (swap == 1)
{
swap = 0;
position = 1;
while (position < (argc - 1))
{
if (strcmp(argv[position], argv[position + 1]) > 0)
{
strcpy(temp, argv[position + 1]);
strcpy(argv[position], argv[position + 1]);
strcpy(argv[position + 1], temp);
}
position++;
}
}
return (0);
}

从上面的代码中,如果我输入"hi"one_answers"hello",而不是打印"你好"嗨",它带来了"你好"的"lo",这是超级奇怪的。

然而,当我只是简单地使用指针(下面的代码(时,它可以完美地工作。

#include <string.h>
#include <stdio.h>
int     main(int argc, char **argv)
{
int swap;
int position;
char temp[1000];
char *i;
swap = 1;
while (swap == 1)
{
swap = 0;
position = 1;
while (position < (argc - 1))
{
if (strcmp(*(argv + position), *(argv +position + 1)) > 0 )
{
i = *(argv + position);
*(argv + position) = *(argv + (position + 1));
*(argv + position + 1) = i;
swap = 1;
}
position++;
}
}
return (0);
}

你能告诉我第一种做法有什么问题吗?

argv向量指向的参数的结构通常如下:

"foobarbazquux"

其中argv[1]指向"f",argv[2]指向"b",而argv[3]指向"q"。

现在你可以很容易地看到,如果你天真地交换这些,你会把论点和指向它们的指针弄得一团糟;例如,如果您交换"foo"one_answers"barbaz",它看起来像这样:

"barbazfooquux".

很好,但现在argv[2]仍然指向同一个位置,这是barbaz中的第二个"a"!

由于使用argv向量中的指针作为目的地,您的第一个方法甚至有更大的缺陷。首先,将foo复制到argv[2]:

"foofooazquux"

然后CCD_ 8到CCD_ 9

"barbazazquux"

你看,这完全是一团糟。

这就是为什么如果不调整argv向量中的指针,您的方法就无法工作的原因。

您提出的第二种方法确实可以完美地工作。

除了@Ctx关于*argv[]布局的回答外,您的数组索引还有一个额外的问题:

错误索引:

{
strcpy(temp, argv[position + 1]);  // You store from index +1
strcpy(argv[position], argv[position + 1]);
strcpy(argv[position + 1], temp);  // Restore into same index.
}

当您存储和恢复相同的索引时,复制到temp在这里没有任何效果。您最终会得到同一字符串的两个副本。

正确索引:

if (strcmp(*(argv + position), *(argv +position + 1)) > 0 )
{
i = *(argv + position);  // <<== Store from pos
*(argv + position) = *(argv + (position + 1));
*(argv + position + 1) = i; // <<== Restore into pos+1
swap = 1;
}

您可以存储position并将其恢复到position + 1中。这就是交换的工作原理。

最新更新