如何让我的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;
}
答案 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,并进行单元测试:){