微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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] 行用 'X' 替换了第 4 个。这对我来说很有意义。

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 中的字符串由许多字符和末尾的 \0 [字符串结尾/空终止符] 字符组成。当您将 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](数组中的第 4 个位置),但是使用该赋值,您将覆盖 字符串结尾字符,发生这种情况:

[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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。