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

Ale*_*iro 2 c arrays string char

我无法在标题中很好地解释我的问题。下面是两套代码:

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

}
Run Code Online (Sandbox Code Playgroud)

输入 789 时,输出 789。 Scanf 不再替换 str 的前 3 个索引,而是替换整个内容。让我感到困惑的是,手动更改第 4 个索引 (str[3]) 会以某种方式使程序更改 str 的前面而不是完全替换它?

我对 C 很陌生,在我的教科书中找不到任何解释。提前感谢您的帮助。

exS*_*ake 7

C 中的字符串由许多字符和末尾的\0 [字符串结尾/空终止符] 字符组成。当你指定的Hello World的STR数组你得到的东西是这样的:

[H][e][l][l][o][ ][W][o][r][l][d][\0]
Run Code Online (Sandbox Code Playgroud)

因此,当您调用scanf并写入789时,您的数组会发生这种情况:

[7][8][9][\0][o][ ][W][o][r][l][d][\0]
Run Code Online (Sandbox Code Playgroud)

然后用X更改str[3](数组中的第 4 个位置),但使用该赋值覆盖字符串字符的结尾,会发生这种情况:

[7][8][9][X][o][ ][W][o][r][l][d][\0]
Run Code Online (Sandbox Code Playgroud)

所以下一个printf调用将打印所有内容,直到他到达\0这就是为什么你在屏幕上看到 789Xo World的原因。在你的第二个例子中,当你在调用scanf后输入789时,你会像这样留下字符串

[7][8][9][\0][o][ ][W][o][r][l][d][\0]
Run Code Online (Sandbox Code Playgroud)

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