【问题标题】:Swapping the element using strcpy not working in the array使用 strcpy 交换元素在数组中不起作用
【发布时间】:2018-07-16 10:44:23
【问题描述】:

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

#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”,而不是打印 “你好”“嗨”,它带来了“你好”“洛”,超级奇怪。

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

#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);
}

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

【问题讨论】:

    标签: c arrays strcpy


    【解决方案1】:

    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-vector 中的指针,您的方法将无法工作。

    您提出的第二种方法确实可以完美运行。

    【讨论】:

      【解决方案2】:

      除了@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。这就是交换的工作原理。

      【讨论】:

        猜你喜欢
        • 2013-12-23
        • 2022-08-03
        • 1970-01-01
        • 1970-01-01
        • 2014-05-12
        • 2020-11-01
        • 1970-01-01
        • 2023-03-16
        • 2021-11-03
        相关资源
        最近更新 更多