K&R C语言练习1-16仅修改main函数的实现是否符合要求问询
K&R 练习1-16 实现方案评价
核心结论
你的方案属于合法的解题方案,完全满足题目限定的「仅修改main函数、不改动外部函数内部逻辑」的要求,核心统计逻辑自洽,但存在少量可优化的点。
合规性说明
- 完全符合题目限制:你没有修改
get_line1函数的任何内部实现,所有调整都集中在main函数范围内,满足题目的前置约束。 - 核心功能达标:
- 可以正确统计任意长度的输入行长度,不受
MAXLINE取值限制,你将MAXLINE设为2、通过分段读取累加长度的思路是可行的,成功绕过了固定缓存大小的限制。 - 带换行的奇数/偶数长度输入行都可以正确统计长度,逻辑没有矛盾。
- 可以正确统计任意长度的输入行长度,不受
可优化点
- 缺少文本打印逻辑:题目要求除了打印行长度外,还需要「尽可能多的打印文本内容」,你的当前实现仅输出了长度,没有输出读取到的行内容,可以在每次调用
get_line1拿到分段内容后,直接打印line数组,即可满足这一要求。 - 边界场景缺陷:如果输入的最后一行没有以
\n结尾、直接到EOF结束,你的代码不会打印这一行的长度,也不会将其计入全文总长度,可以在while循环结束后补充判断逻辑修复该问题。
优化后main函数参考
int main() { int len; int max = MAXLINE; char line[MAXLINE]; int tot = 0; int text_l = 0; while ((len = get_line1(line, max)) > 0) { printf("%s", line); // 打印分段读取到的内容,满足尽可能输出文本的要求 if (line[len - 1] != '\n') { tot += len; } else { printf("当前行长度:%d\n", tot + 1); text_l += tot + 1; tot = 0; } } // 处理最后一行无换行的边界场景 if (tot > 0) { printf("\n最后一行长度:%d\n", tot); text_l += tot; } printf("全文总长度:%d\n", text_l); return 0; }
内容的提问来源于stack exchange,提问作者PwNzDust
相关产品推荐
相关产品推荐

