从函数中替换char []中的字符

时间:2011-09-28 21:55:53

标签: c string replace character arrays

如何让我的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;
}

2 个答案:

答案 0 :(得分:6)

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

char string[] = "Hello World!";

答案 1 :(得分:5)

修改

要获得编辑string的'建议',您可以编辑指针 inplace:

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 char数组。

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

我认为问题将会消失

<强>说明: 编译器可以在(只读)数据段中分配字符串文字。 转换为char *(而不是const char *)实际上是无效的。如果您使用例如

gcc -Wall test.c
你会收到警告。

有趣的实验:

在此观察(因为它是未定义的行为)编译器可以在这种情况下做有趣的事情:

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

YMMV。使用-Wall,如果可以的话,使用某种lint,并进行单元测试:){