Arrays 通过编辑字符数组替换的C字符串与更改的C字符串

Arrays 通过编辑字符数组替换的C字符串与更改的C字符串,arrays,c,string,char,Arrays,C,String,Char,我不能在标题中很好地解释我的问题。以下是两组代码: int main() { char str[81] = "Hello World"; scanf("%s", str); str[3] = 'X'; printf("%s", str); return 0; } 当进入789时,输出为“789Xo World”,这表明scanf函数正在用输入替换字符数组的前3个索引,str[3]行将第4个索引

我不能在标题中很好地解释我的问题。以下是两组代码:

int main() {
    char str[81] = "Hello World";
    scanf("%s", str);
    str[3] = 'X';
    printf("%s", str);
    return 0;

}
当进入789时,输出为“789Xo World”,这表明scanf函数正在用输入替换字符数组的前3个索引,str[3]行将第4个索引替换为“X”。这对我来说很有意义

int main() {
    char str[81] = "Hello World";
    scanf("%s", str);
    printf("%s", str);
    return 0;

}
当输入789时,输出789。Scanf不再取代str的前3个索引,而是整个索引。手动更改第四个索引(str[3])会使程序更改str的前端而不是完全替换它,这让我感到困惑


我对C语言很陌生,在我的课本上找不到任何解释。提前感谢您的帮助。

C中的字符串由许多字符加上结尾的\0[end of String/null terminator]字符组成。当您将Hello World分配给str数组时,您会得到如下结果:

[H][e][l][l][o][ ][W][o][r][l][d][\0]
因此,当您调用scanf并写入789时,数组会发生以下情况:

[7][8][9][\0][o][ ][W][o][r][l][d][\0]
然后用X更改str[3](数组中的第四个位置),但通过该赋值,您将覆盖字符串的结尾,发生以下情况:

[7][8][9][X][o][ ][W][o][r][l][d][\0]
因此,下一次printf调用将打印所有内容,直到他到达\0,这就是屏幕上显示789Xo World的原因。在第二个示例中,当您在调用scanf后键入789时,您将像这样保留字符串

[7][8][9][\0][o][ ][W][o][r][l][d][\0]

printf将在第一个\0处停止,您将得到789

scanf
未写入
X
scanf
写入空终止符。用
X
覆盖空终止符。请在
str[3]=%d\n,str[3])
之前尝试
printf(“str[3]=%d\n,str[3])
以查看正在覆盖的内容。