【问题标题】:Replace a character in a char[] from a function从函数中替换 char[] 中的字符
【发布时间】:2011-11-27 06:05:08
【问题描述】:

如何让我的 replace_char 函数正常工作?

我在下面的函数中尝试的方式在 Ubuntu 中使用 gcc 返回分段错误。

我尝试了其他方法,但每次尝试更改值时都会出错。

int main (void)
{  
  char* string = "Hello World!";

  printf ("%s\n", string);
  replace_char(string, 10, 'a');
  printf ("%s\n", string);
}

void replace_char(char str[], int n, char c)
{
  str[n] = c;
}

【问题讨论】:

  • 它不允许我编辑,但是您在 printfs 之后错过了开场白。

标签: c string replace character arrays


【解决方案1】:

编辑

要获得编辑string 的“建议”,您可以编辑指针就地:

void replace_char(char*& str, int n, char c)
{
  str = strdup(str);
  str[n] = c;
}

int main()
{
    char* string = "Hello World!";
    string = replace_char(string, 10, 'a');

    // ...
    free(string);
}

注意你现在必须记住在调用它之后在字符串上调用free。相反,我建议您按照我之前的建议进行操作:如果需要,将文字包装在 strdup 中。这样你不 不会一直产生分配副本的成本(仅在必要时)。


问题在于“Hello World”是一个 const literal 字符数组。

const char* conststr = "Hello World!";
char * string = strdup(conststr);

我认为问题会消失

解释: 编译器可以在(只读)数据段中分配字符串文字。 转换为 char*(相对于 const char*)实际上是无效的。如果您使用例如

gcc -Wall test.c

您会收到警告。

有趣的实验:

请注意(因为它是未定义行为)编译器在这种情况下可以做一些有趣的事情:

http://ideone.com/C39R6 表明程序不会“崩溃”,而是默默地无法修改字符串文字,除非字符串被复制。

YMMV。使用 -Wall,尽可能使用某种 lint,然后进行单元测试 :){

【讨论】:

  • 添加了一个有趣的实验,突出显示未定义行为中的 未定义
  • PS:你注意到ideone.com/C39R6 示例中的other instance of Undefined Behaviour that I fixed 了吗? (提示:假设 C89)
  • 我知道它是一个文字字符数组,但我想编辑它并在该函数中替换它。
  • @KyleUithoven:祝你好运。我建议你给你的编译器供应商写一封信,或者最好给标准委员会...
  • @KyleUithoven:回复Is there a way to copy the value from the literal to char string[] and change the value and put it back into str?:是的,代码显示了如何。请注意,string 值本身不是常量,只是最初指向的数据。因此,您可以更新 string 以指向修改后的数据(其他地方)。作为记录,我已经更新了答案,演示了您如何可以做到这一点。
【解决方案2】:

您的replace_char 函数没有任何问题。问题是您正在尝试修改字符串文字(“Hello World!”),这是未定义的行为。尝试复制字符串,如下所示:

char string[] = "Hello World!";

【讨论】:

  • ""Hello World!" 实际上是 char const*,但它允许转换为 char* 以支持遗留代码。" - 实际上,这对于 C++ 来说是正确的(实际上,它是一个 const char 数组),但在 C 中,文字被定义为非 const char[] 导致修改时出现 UB。
  • 首先,字符串文字是一个数组,而不是一个指针。在大多数情况下,它会隐式转换为指针,但例如 sizeof "Hello World!" 会产生数组 (12) 的大小,而不是指针的大小。其次,字符串文字在 C++ 中是 const,但在 C 中不是。在 C 中,字符串文字仍然是非常量(以避免破坏遗留代码),但尝试修改一个是未定义的行为。
  • @KeithThompson:高五! :)
  • @MatteoItalia ...我们的也是如此。 8-)}
  • @Matteo Italia,Keith Thompson:谢谢,我编辑了我的答案。我偏向 C++ :P
猜你喜欢
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 2018-06-30
相关资源
最近更新 更多