我目前正在学习有关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-1
和c == '\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/