循环首次迭代时初始化变量的方式是否优雅?C空格替换程序疑问
连续空格压缩程序的初始值处理优化建议
用-1初始化previous的方式不算优雅——虽然能正常工作,但-1属于非ASCII字符范围的特殊值,属于“魔法值”范畴,代码可读性差,其他开发者看到时需要额外思考这个值的意义,不符合代码“自文档化”的原则。你提到的“不应初始化为随机值”表述其实不准确,-1是确定值,但它并非直观的业务逻辑标记,这才是问题所在。
另外提个小细节:你的代码里void main()不符合C标准,标准写法应该是int main(void),并在最后添加return 0;。
下面给你两种更优雅的替代方案:
方案一:用状态标记跟踪空格状态
这种方式不需要维护“前一个字符”,而是直接跟踪当前是否处于连续空格的状态,逻辑更直观,空文件时循环直接跳过,不会执行多余代码:
#include <stdio.h> int main(void) { int c; int in_space = 0; // 标记是否已经输出过连续空格中的第一个 while ((c = getchar()) != EOF) { if (c == ' ') { if (!in_space) { putchar(c); in_space = 1; } } else { putchar(c); in_space = 0; } } return 0; }
方案二:用布尔标记明确是否存在前值
如果坚持要基于“前一个字符”的逻辑判断,可以增加一个布尔变量标记是否已经读取过字符,避免用魔法值-1:
#include <stdio.h> int main(void) { int actual, previous; int has_previous = 0; // 标记是否有已读取的前一个字符 while ((actual = getchar()) != EOF) { // 第一次读取时直接输出,后续判断是否连续空格 if (!has_previous || !(previous == ' ' && actual == ' ')) { putchar(actual); previous = actual; has_previous = 1; } } return 0; }
至于你考虑的do-while循环,确实存在空文件时无意义执行循环体的问题——因为do-while会先执行一次循环体,再判断条件,空文件下actual会被赋值为EOF,但还是会进入循环体执行if判断,所以这种场景下while循环更合适。
内容的提问来源于stack exchange,提问作者ivangouba
相关产品推荐
相关产品推荐

