【问题标题】:Edit an array of char*编辑 char* 数组
【发布时间】:2012-06-15 21:09:53
【问题描述】:

我有一个char * 数组,如下所示:

char * gradient_xpm[] = {"abc", "def", "ghi"};

我需要更改这些字符串的值。

我尝试了strcpy= 运算符,但它给了我一个分段错误。

例如:

strcpy(gradient_xpm[1],"jkl");
gradient_xpm[1][2] = 'x';

我什至无法编辑一个字符。如何编辑这些值?

【问题讨论】:

  • 这确实比 C++ 更像 C。这是糟糕的 C++ 实践。
  • +1 @DeadMG 但也许他需要使用接受 C 字符串的 C 库?
  • @EitanT 这就是.c_str() 的用途。
  • @KillianDS 如果您需要将可修改的char 数组传递给该函数,则不要(我不是为这种做法辩护,我只是说它可能有另一个原因)。
  • @EitanT,首先仍然不是使用 C 的真正理由。先把它复制过来。

标签: c string char


【解决方案1】:

您的数组中有字符串常量,这些常量无法更改。这是您的段错误的原因。

您需要在不使用字符串常量的情况下设置您的数组,然后将字符串常量复制到您的数组中。

类似:

char *gradient_xpm[3];

gradient_xpm[1] = (char *) malloc(sizeof(char) * (MAX_STR_LEN + 1));
strncpy(gradient_xpm, "jkl", MAX_STR_LEN);

// now this will work:
gradient_xpm[1][2] = 'x';

gradient_xpm[0]gradient_xpm[2] 也是如此。

【讨论】:

    【解决方案2】:

    在 C 中修改字符串文字是未定义的行为。所以任何事情都可能发生,不一定是段错误。

    来自C99 standard,6.4.5 字符串文字6.4.5/6:

    不确定这些数组是否是不同的,只要它们的 元素具有适当的值。如果程序试图 修改这样的数组,行为未定义。

    【讨论】:

      【解决方案3】:

      您不能修改标记为禁止使用的字符串常量。但是,您可以修改在堆或堆栈上分配的内存。也就是说,如果您使用 C++,请考虑使用 the string class 数组,而不是管理 char * 数组。内存管理问题更容易处理。

      【讨论】:

        【解决方案4】:

        您已经使用字符串文字实现了这一点,您无法更改它们

        【讨论】:

          【解决方案5】:

          不要编辑内容 - 这是一个坏主意。在某些编译器中,这是一个编译时错误,因为字符串常量是 const char *,而不是 char*

          相反,翻转指针:

          gradient_xpm[1] = "jkl"; 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-04-29
            • 2013-09-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-20
            • 2017-10-30
            相关资源
            最近更新 更多