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