我试图交换数组中的元素(这是非常基本的,但是当我尝试更改数组的索引时,它会弄乱整个数组)
'git pull --rebase=preserve upstream develop'
从上面的代码中,如果我输入“ hi”和“ hello”,而不是打印 “ hello”“ hi”,它带来了“ hello”“ lo”,这非常奇怪。
但是,当我仅使用指针(下面的代码)时,它就可以正常工作。
'git pull'
您能告诉我第一种做事方式有什么问题吗?
答案 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"
,然后从barbaz
到argv[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
中。交换就是这样的。