【问题标题】:C strings being replaced vs being changed by editing the char array通过编辑 char 数组替换 C 字符串与更改
【发布时间】:2021-01-21 01:00:37
【问题描述】:

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

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 语言非常陌生,在我的教科书中找不到任何解释。提前感谢您的帮助。

【问题讨论】:

  • scanf 没有写 Xscanf 写入一个空终止符。你用 X 覆盖那个空终止符。
  • str[3] = 'X'; 之前尝试printf("str[3] = %d\n", str[3]) 以查看您要覆盖的内容。

标签: arrays c string char


【解决方案1】:

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 个位置),但是通过这个赋值你覆盖了字符串字符的 end ,发生这种情况:

[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

【讨论】:

    猜你喜欢
    • 2011-10-13
    • 2018-09-01
    • 2013-11-23
    • 2019-02-26
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2018-06-30
    相关资源
    最近更新 更多