关于K&R《C程序设计》getline函数中变量i的取值疑问
关于K&R《C程序设计》中getline函数的i值疑问解答
首先明确:i是函数内部的局部变量,在for循环开始前被初始化为0,在整个函数执行过程中,它的值会持续更新并保留,直到函数结束,所以循环外的代码可以直接使用它的当前值。
循环执行的核心逻辑
for循环的执行流程是:
- 初始化
i = 0; - 每次先判断条件:
i < lim - 1 && (c = getchar()) != EOF && c != '\n';- 若条件全部满足:执行循环体
s[i] = c,然后执行++i(i自增1); - 若任意一个条件不满足:直接退出循环,不会执行
++i。
- 若条件全部满足:执行循环体
当循环因读到'\n'退出时的i值
当输入流中出现'\n'时,(c = getchar())会把'\n'存入变量c,此时第三个条件c != '\n'不成立,循环终止。
举个实际例子:假设输入是"abc\n"且lim足够大:
- 处理
'a':i从0变成1; - 处理
'b':i从1变成2; - 处理
'c':i从2变成3; - 下一次判断条件时,读到
'\n',条件不满足,循环退出,此时i的值停在3。
这个i=3正好是数组中存放'\n'的正确索引位置(前面已存3个字符,对应索引0、1、2),所以s[i] = c能把'\n'正确写入数组的第4个位置(索引3),之后++i把计数加1,让最终返回值包含这个换行符。
其他循环终止场景的i值
- 如果循环因为
i >= lim-1(数组空间耗尽)退出:此时i的值是lim-1,已填满数组前lim-1个位置; - 如果循环因为读到
EOF退出:此时i的值是已成功读取并存入数组的字符总数。
无论哪种情况,循环结束后i的取值都是有效的,后续代码可直接用它操作数组或统计字符数。
内容的提问来源于stack exchange,提问作者wantice
相关产品推荐
相关产品推荐

