arrays - C 字符串被替换与通过编辑 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 函数将 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 中的字符串由许多字符加上末尾的\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]

然后您将 str[3](数组中的第 4 个位置)更改为 X,但通过该赋值,您将覆盖字符串字符的 结尾,这会发生:

[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

关于arrays - C 字符串被替换与通过编辑 char 数组进行更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65819787/

相关文章:

php - php中echo json数据供数据表使用

c - 如何优雅地将大量方法指针传递给用 C 编写的 DLL?

javascript - Discord.js 参数startsWith 不能是正则表达式

具有垂直选项卡内容的 Php 数组

java - Java 中的正则表达式将非空白字符串分解为单个字符和数字 block

javascript - JQuery .each() 向后

c - 计算上限和下限时出现奇怪的错误

c - Visualstudio.com 认为最新的 libgit2 已过时

Linux Shell 脚本剪切包含路径的变量的最后一部分

python - 从维基百科的不同预算变体中提取整数价格