C 字符串被替换与通过编辑 char 数组进行更改
C strings being replaced vs being changed by editing the char array
我无法在标题中很好地解释我的问题。这里有两组代码:
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] 行用 [=20 替换第 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 [end of string/null 终止符] 字符组成。当您将 Hello World 分配给 str 数组时,您会得到如下内容:
[H][e][l][l][o][ ][W][o][r][l][d][[=10=]]
因此,当您调用 scanf 并写入 789 时,您的数组会发生这种情况:
[7][8][9][[=11=]][o][ ][W][o][r][l][d][[=11=]]
然后你用 X 改变 str[3] (数组中的第 4 个位置)但是你正在覆盖这个分配字符串结尾字符,出现这种情况:
[7][8][9][X][o][ ][W][o][r][l][d][[=12=]]
所以下一个 printf 调用将打印所有内容,直到他到达 \0 这就是为什么你得到 789Xo World 在屏幕上。在您的第二个示例中,当您在调用 scanf 后键入 789 时,您将留下这样的字符串
[7][8][9][[=11=]][o][ ][W][o][r][l][d][[=11=]]
printf 将在第一个 \0 处停止,您将得到 789.
我无法在标题中很好地解释我的问题。这里有两组代码:
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] 行用 [=20 替换第 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 [end of string/null 终止符] 字符组成。当您将 Hello World 分配给 str 数组时,您会得到如下内容:
[H][e][l][l][o][ ][W][o][r][l][d][[=10=]]
因此,当您调用 scanf 并写入 789 时,您的数组会发生这种情况:
[7][8][9][[=11=]][o][ ][W][o][r][l][d][[=11=]]
然后你用 X 改变 str[3] (数组中的第 4 个位置)但是你正在覆盖这个分配字符串结尾字符,出现这种情况:
[7][8][9][X][o][ ][W][o][r][l][d][[=12=]]
所以下一个 printf 调用将打印所有内容,直到他到达 \0 这就是为什么你得到 789Xo World 在屏幕上。在您的第二个示例中,当您在调用 scanf 后键入 789 时,您将留下这样的字符串
[7][8][9][[=11=]][o][ ][W][o][r][l][d][[=11=]]
printf 将在第一个 \0 处停止,您将得到 789.