c - 为什么更改字符串的字符不会给出所需的字符?

标签 c

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

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提到这应该导致段错误或访问冲突错误,但它并没有真正解释原因。

最佳答案

str1[0] = "b";

这里,"b" 是一个字符串文字,不是一个字符。字符用单引号括起来:

str1[0] = 'b';

如果您启用了编译器警告,您会得到如下内容:

warning: incompatible pointer to integer conversion assigning to 'char' from 'char [2]' [-Wint-conversion]

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

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

str1[5] = '\0';

关于c - 为什么更改字符串的字符不会给出所需的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41402484/

相关文章:

c - C 中的声明、初始化和指令

c - scanf() 将换行符保留在缓冲区中

无法继续进行 switch case C 编程

iphone - 寻求有关预乘 alpha 的一些帮助

c - 2 字节的 Malloc 会产生问题

c - 在C中查找二维数组中最长的字符串

c - 设计 Shellcode 会给出错误的结果

对 C 中 free() 的用法感到困惑

c - 编译器如何处理超出范围的 char 值?

c - 是否可以从 OCaml 调用 C 函数并有效地传递一个巨大的数组?