我正在尝试使用字符文字初始化后编辑字符串,如下所示:
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提到这会导致段错误或访问冲突错误,但它并没有真正解释原因。
答案 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