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

标签 c arrays kernighan-and-ritchie character-arrays

我很难理解这个函数:

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/

相关文章:

c - gcc如何识别-lfl对应于flex库?

c - 如何将表示数字的 char 字符转换为 int 中的相同数字?

C 函数有时返回太慢

arrays - 为什么我的数组不从映射到它的第一个项目开始? swift

c - 求一个数的近似平方根

python - 如何压缩两个数组而不截断到最短的数组?

c++ - 如何将模板参数包转换为函数的多个指针参数?

c - 在 OS X 上使用 clang 链接 OSMalloc.h 时出现 undefined symbol

c - K&R 中边界有限的 qsort |排序过程不会在字符串中的下一个位置继续

c - 我需要帮助来理解 C Programming Language 书中练习 5-12 的要求