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

时间:2018-07-16 10:44:23

标签: c arrays strcpy

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

'git pull --rebase=preserve upstream develop'

从上面的代码中,如果我输入“ hi”和“ hello”,而不是打印 “ hello”“ hi”,它带来了“ hello”“ lo”,这非常奇怪。

但是,当我仅使用指针(下面的代码)时,它就可以正常工作。

'git pull'

您能告诉我第一种做事方式有什么问题吗?

2 个答案:

答案 0 :(得分:2)

argv向量指向的参数通常是这样构造的:

"foo\0barbaz\0quux\0"

argv[1]指向“ f”,argv[2]指向“ b”,argv[3]指向“ q”。

现在,您可以很容易地看到,如果您天真地交换了参数和指向它们的指针,就会弄乱它们;例如,如果交换“ foo”和“ barbaz”,则看起来像这样:

"barbaz\0foo\0quux\0".

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

由于您将argv向量中的指针用作目标,因此您的第一种方法更加有缺陷。首先,将foo复制到argv[2]

"foo\0foo\0az\0quux\0"

,然后从barbazargv[1]

"barbaz\0\0az\0quux\0"

你看,这完全搞砸了。

这就是为什么如果不调整argv-向量中的指针就无法使用方法的原因。

您建议的第二种方法确实应该可以完美地工作。

答案 1 :(得分:1)

除了@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中。交换就是这样的。