我目前正在学习有关C的著名书籍-C编程语言2Ed。当我尝试P.29中的代码时,我认为getline函数出了点问题:

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;
}

如果for循环结束时i == lim-1c == '\n'怎么办?在这种情况下,我认为数组将超出边界,因为s[lim]将设置为“\0”。

有人认为这是错的吗?谢谢你的帮助。

最佳答案

&&运算符具有“早期”语义。这意味着,如果使用i == lim-1,则不执行其余条件-特别是不会调用c = getchar()

这意味着在这种情况下,c将从循环的最后一次迭代获得其值-并且由于循环条件包括c != '\n',因此该值不能为'\n'(否则该循环将在最后一次退出)。

只要lim大于1,这便是正确的,这必须是该函数的先决条件(因为调用lim小于或等于1的函数会导致读取未初始化的c值)。

关于c - 有人认为C编程语言2E Page29出了什么问题吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17333576/

10-12 05:08