我很难理解这个函数:
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=10
和 s[]
设置为 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[]
稍后打印到 012345678
,s[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/