替换C语言字符串中的单个字符元素

16
我正在尝试在C语言中做一些非常基础的事情,但我不断地遇到分段错误。我只想用不同的字母替换单词中的一个字母- 在这个例子中将l替换为L。有人能帮忙解释一下我哪里出错了吗?我认为这应该是一个非常基本的问题,但我不知道为什么它不起作用。
#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{
    char *string1;

    string1 = "hello";
    printf("string1 %s\n", string1);    

    printf("string1[2] %c\n", string1[2]);
    string1[2] = 'L';
    printf("string1 %s\n", string1);

    return 0;
}

我的输出结果是

string1 hello
string1[2] l
段错误

谢谢!


1
String1是指向只读内存的指针(在大多数系统中),因为它是一个常量初始化器。你不能直接写入该字符串,必须先将其复制。 - gaige
4个回答

19
string1 = "hello";
string1[2] = 'L';

不能更改字符串字面值,这是未定义的行为。尝试这样做:

char string1[] = "hello";

或者也许:

char *string1;
string1 = malloc(6); /* hello + 0-terminator */
strcpy(string1, "hello");

/* Stuff. */

free(string1);

没什么大不了的,但你可以使用strdup("hello")代替调用malloc和strcpy。strdup会为你完成这个操作,更方便使用。 - Zoneur
@Zoneur 没错,我经常推荐使用 strdup,但是它有时会有问题,因为它不是标准的。 - cnicutar
如果我想把这个值从“hello”改为“helxo”,你的代码就不能工作了...要改变指针中特定的值...替换字符串C中的单个字符元素。 - user3402040

4
char *string1;
string1 = "hello";

string1指向一个字符串字面值,而字符串字面值是不可修改的。

你可以使用字符串字面值的元素初始化一个数组。

char string1[] =  "hello";

string1数组中的元素是可修改的。


2
char *string1 = "hello";

运行代码时,字符串字面量将位于只读段中。操作系统不允许代码更改该内存块,因此会导致段错误。

char string1[] = "hello";

代码运行时,字符串字面量将被推送到堆栈上。

0
 string1[2] = 'L';

你正在尝试更改一个字符串常量,这在C语言中是未定义的行为。 相反,请使用string1[]="hello"; 你得到的分段错误是因为该常量可能存储在内存的只读部分,尝试写入它会产生未定义的行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接