gpt4 book ai didi

c - 经典书籍 "The C Programming Language"中1.9章的示例代码是否有错误?

转载 作者:太空狗 更新时间:2023-10-29 15:24:10 26 4
gpt4 key购买 nike

在 Brian & Dennis 的 C 语言经典著作《The C Programming Language》的第 1.9 章中,有一段代码是关于函数“getline”的,该函数用于将输入文本的下一行复制到一个char 类型字符串并检查溢出。我引用下面的代码:

int getline(char line[], int maxline);
int getline(char s[], int limit)
{
int c,i;
for (i=0; i<limit-1 && (c=getchar())!=EOF && c!='\n'; ++i) /* ** */
s[i]=c;
if (c == '\n') {
s[i]=c;
++i;
}
s[i] = '\0';
return i;
}

问题来了:参数'limit'是行的最大长度,所以数组s[]只能包含从s[0]到s[limit-1]的元素集合。如果变量 c 到 getchar() 的最后一个字符是 '\n' 并且这个字符的索引是 limit-1,那么 'for' 循环中的判断部分会因为 'i==limit-1' 而失败但不是'c!='\n'(按照从左到右的顺序)。接下来,if子句会起作用,因为'c=='\n'',所以s[limit-1]=c,那么++i会将i的值设置为limit。 s[i]='\0' 会溢出,因为 s[limit] 超出了字符串的限制。我的分析对不对?感谢您提供任何有用的答案。

最佳答案

你的分析是错误的。如果 i == limit-1,由于短路评估,循环会在未读入 c 的情况下中断。因此,您永远不会输入 if (c == '\n')i 保持 limit-1 并且没有溢出。

概念上,你可以这样想循环条件:“如果i低于limit-1,则读取一个字符,如果不是EOF或换行符,进入循环体。”因此,如果 ilimit-1,您永远不会阅读。

关于c - 经典书籍 "The C Programming Language"中1.9章的示例代码是否有错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25209442/

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