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

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

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

}

输入 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;

}

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

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

回答

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

[H][e][l][l][o][ ][W][o][r][l][d][]

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

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

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

[7][8][9][X][o][ ][W][o][r][l][d][]

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

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


以上是C字符串被替换与通过编辑字符数组被更改的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>