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



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

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

我已经尝试了其他方法,但每次我试图改变值,我得到一个错误。

int main (void)
{  
  char* string = "Hello World!";
  printf ("%sn", string);
  replace_char(string, 10, 'a');
  printf ("%sn", string);
}
void replace_char(char str[], int n, char c)
{
  str[n] = c;
}

您的replace_char函数没有任何问题。问题是,您试图修改字符串字面值("Hello World!"),这是未定义的行为。试着复制这个字符串,像这样:

char string[] = "Hello World!";

编辑

要获得编辑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 "是一个constliteral字符数组。

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

我想问题会解决的

解释:编译器可以在(只读)数据段中分配字符串字面值。转换为char*类型(与const char*类型相对)实际上是无效的。如果你用

gcc -Wall test.c

你会得到一个警告。

有趣的实验:

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

http://ideone.com/C39R6显示程序不会'崩溃',但静默无法修改字符串字面值,除非该字符串被复制。

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

最新更新