You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环首次迭代时初始化变量的方式是否优雅?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:50:19