gpt4 book ai didi

c - K&R 1.9\\超出数组范围?

转载 作者:太空宇宙 更新时间:2023-11-04 01:27:45 24 4
gpt4 key购买 nike

我很难理解这个函数:

int getline(char s[], int lim)
{
int c,i;

for (i=0; i<lim-1 && (c=getchar()) != EOF && c!='\n'; ++i)
s[i] = c;
if (c == '\n')
{
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}

我将尝试通过输入 0123456789\n(总共 11 个字符)的示例来解释我的疑虑。

在此示例中,lim=10s[] 设置为 line[10](来自调用参数的声明getline).

当循环通过 ++i 完成运行时,这些值是:i==9, s[0]==0, .. ., s[9]==9, c=='\n'(因为 getchar 作为检查条件的一部分执行)。

然后 if 检查肯定并且 s[9] 设置为 '\n'i提高到 10

最后,s[10]设置为'\0',但是s[10]不存在!

此外,s[] 稍后打印到 012345678s[9] 的值被保留给 '\n''\0'

'\0' 存储在哪里?我知道它在某处,因为后来另一个函数使用它来检查数组的末尾。

最佳答案

因为 chcek i<lim-1 , 如果 lim是 10,i永远不会变成9里面for循环,它可以达到最大值 8 , 在条件检查失败之前。

i 之后变成 9 , for 的第一部分循环条件检查失败,控制退出循环[不执行 getchar()对于该迭代)。

所以,直到 s[8]已阅读并位于 s[9] , \0已存储。

关于c - K&R 1.9\\超出数组范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28260543/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com