首页 > 解决方案 > 使用 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”和“hello”,而不是打印“hello”“hi”,它会带来“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);
}

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

标签: carraysstrcpy

解决方案


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向量中的指针作为目标。首先,您复制fooargv[2]

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

然后barbazargv[1]

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

你看,这完全搞砸了。

这就是为什么您的方法在不调整argv-vector 中的指针的情况下不起作用的原因。

您提出的第二种方法确实应该完美无缺。


推荐阅读