K&R C语言练习1-18:删除全空白行实现首字符丢失问题咨询
K&R C 练习1-18 代码问题说明
练习原题
编写一个程序,移除输入每行末尾的空格和制表符,并且删除完全空白的行。
首字符截断问题根因
第一版代码的main函数中,每次调用get_line1读取完一行内容后,额外执行了一次getchar()调用,该调用会读取下一行的第一个字符且未做任何存储使用,相当于直接丢弃了该字符,因此会出现输入的There变成here、That变成hat的首字符丢失问题。
其他可优化/修复点
- 运算符使用不规范:
blank1函数中判断字符为空格或制表符的条件,使用了按位或运算符|,应替换为逻辑或运算符||,当前场景下两者运算结果一致,但语义不符合条件判断的使用规范。 - 冗余变量可删除:代码中定义的
IN、OUT宏,以及第二版main函数中声明的verso、longest、i变量均未被使用,可直接删除避免编译警告。 blank1函数效率可优化:当前实现需要遍历整行统计空格/制表符数量才能判断是否为空行,可调整为遍历到任意非空白(非空格、非制表、非换行)字符时直接返回0,不需要全量遍历,优化后代码如下:
int blank1(char s[], int len){ int i; for (i=0; i<len; i++){ if(s[i] != ' ' && s[i] != '\t' && s[i] != '\n'){ return 0; } } return 1; }
第二版修改正确性验证
你提交的第二版修改,移除了main函数中额外的getchar()调用,改为在get_line1中检测到EOF时返回-1,主循环通过返回值判断是否终止,已经完全解决了首字符截断的问题,当前可正常实现删除全空白行的需求。
内容的提问来源于stack exchange,提问作者PwNzDust
相关产品推荐
相关产品推荐

