【问题标题】:How to copy an array of char pointer to another in C如何在C中将char指针数组复制到另一个数组
【发布时间】:2016-04-12 06:37:52
【问题描述】:

我正在尝试将一个 char 指针数组存储到另一个 char 指针数组。我遇到了同样的分段错误。

int main(int argc, const char* argv[])
{   
    int argcCpy = argc;
    char* argvCpy[10] = {};

    for(argcCpy = argc; argcCpy>0; argcCpy--)
    {   
        argvCpy[argcCpy] = (char *) malloc(strlen(argv[argcCpy]));
        memcpy(argvCpy[argcCpy], argv[argcCpy], strlen(argv[argcCpy]));
        printf("\nCount: %d, string: %s", argcCpy, argvCpy[argcCpy]);
    }
    return 0;
}

我花了足够多的时间来完成这项工作,但我无法做到。此外,已经提出了同样的问题,也没有得到回答。如果有人可以让我知道相同的工作代码,那将非常有帮助。

希望得到答复。

类似问题的链接被忽略了 -- C Beginner - Copying a char *array to another char *array

谢谢。

【问题讨论】:

  • argvCpy[0] 在你的程序中应该包含什么?垃圾?
  • 为什么我需要一个变量来保存垃圾值?已经初始化!!感谢 cmets :) @Lundin 我需要这个 var 来保存 *argv 数组..
  • 我的意思是:您的代码不会将任何内容复制到索引 0 中,因此它只是坐在那里占用空间。这反过来表明数组大小不正确或循环未正确编写。
  • 我需要来自 arg 2 @Lundin 的值。因此从 arg2 开始将其存储在 argvCpy 中。
  • 但此代码将 argv[x] 到 argv[1] 以倒序存储到您的数组中。那么你需要多少参数呢? 8?那为什么要声明一个 10 的数组呢?

标签: c arrays pointers char


【解决方案1】:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, const char* argv[])
{
    int argcCpy = argc;
    char* argvCpy[10] = {};

    if (argc > 9)
    {
        return 1;
    }

    for(int i = argc; i > 0; i--)
    {
        if (argv[i] == NULL)
        {
            argvCpy[i] = NULL;
        }
        else
        {
            argvCpy[i] = (char *) malloc(strlen(argv[i]) + 1);
            if (argvCpy[i] != NULL)
            {
                strcpy(argvCpy[i], argv[i]);
            }
        }
    }

    for (int i = 0; i <= argcCpy; i++)
    {
        if (argvCpy[i] != NULL)
        {
            printf("Count: %d, string: %s\n", i, argvCpy[i]);
        }
        else
        {
            printf("Count: %d, string is null\n", i);
        }
    }

    return 0;
}

检查 argc 是不是太高。 argv[argc] 为 NULL,请考虑到这一点。 使用strcpy,并为结尾\0分配足够的空间。

编辑:第二个for 循环显示内容。

【讨论】:

  • 好极了。非常感谢您的及时帮助。它的工作。 @jdarthenay
  • 不过,他们为什么要将程序名称argv[0] 存储在数组中并不明显。
  • @Lundin 如果您不想要它,请将其设置为 NULL,但不要像在 OP 的代码中那样保留它。或索引 argvCpy 以便 argvCpy[i] 代表 argv[i + 1]
  • @jdarthenay,有什么方法可以在没有分段错误的情况下使用 else 中的数组..??
  • @Denise 你不应该遇到分段错误。你到底在做什么才能得到一个?
【解决方案2】:

您必须为终止的 NUL 多分配一个字节:

改变

 malloc(strlen(argv[argcCpy]);

 malloc(strlen(argv[argcCpy] + 1);

你还必须用memcpy多复制一个字节

改变

 memcpy(argvCpy[argcCpy], argv[argcCpy], strlen(argv[argcCpy]));

 memcpy(argvCpy[argcCpy], argv[argcCpy], strlen(argv[argcCpy]) + 1);

顺便说一句,你可以替换

 memcpy(argvCpy[argcCpy], argv[argcCpy], strlen(argv[argcCpy]) + 1);

通过

 strcpy(argvCpy[argcCpy], argv[argcCpy]);

更简单明了。

最后但并非最不重要的替换

for(argcCpy = argc; argcCpy>0; argcCpy--)

通过

for(argcCpy = argc - 1; argcCpy>0; argcCpy--)

argv 数组的最后一个元素是argv[argc-1]

但请注意,如果命令行参数超过 10 个,就会遇到问题。

【讨论】:

  • 迈克尔,它仍然输出为分段错误。
  • 更简单(因为无论如何您都在使用 malloc 进行内存分配):argvCpy[argcCpy] = strdup (argv[argcCpy]);
  • 两个字符串走进一个酒吧。一个人说“我要一杯啤酒,拜托794(*&%#$)${”。另一个说,“你得原谅我的朋友,他没有被终止。” (这是一种永不忘记的方式!)
  • 非常感谢@Mike & Micheal Walz
猜你喜欢
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2016-07-21
  • 1970-01-01
  • 2021-11-21
相关资源
最近更新 更多