为什么更改字符串的字符不能提供所需的字符?

时间:2016-12-30 20:45:13

标签: c

我正在尝试使用字符文字初始化后编辑字符串,如下所示:

int main() {
    char str1[10] = "hello";
    str1[0] = "b";
    printf("%s\n", str1);
    return 0;
}

结果是“dello”,即“d”而不是“b”。同样,下面只是废话。

int main() {

    char str1[10];

    str1[0] = "h";
    str1[1] = "e";
    str1[2] = "l";
    str1[3] = "l";
    str1[4] = "o";

    printf("%s\n", str1);
}

我发现一个StackOverflow post提到这会导致段错误或访问冲突错误,但它并没有真正解释原因。

2 个答案:

答案 0 :(得分:12)

str1[0] = "b";

此处,"b"是字符串文字,不是字符。字符用单引号括起来:

str1[0] = 'b';

如果您启用了编译器警告,则可以获得以下内容:

  

警告:指向整数转换的不兼容指针分配给' char'来自' char [2]' [-Wint转换]

str1[0] = "b";
        ^ ~~~

在第二个代码中,您的字符串缺少终止null-character,因此将其传递给printf会调用未定义的行为,因为printf无法知道字符串的结束位置。要在末尾附加空字符,只需执行:

str1[5] = '\0';

答案 1 :(得分:3)

在C中,单引号标识字符,双引号创建字符串文字。

尝试执行以下操作:

str1[0] = 'b'; //note the single quote