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

printf()/puts()调用失败后能否恢复?退出前用fprintf(stderr)是否有用?

关于Brainfuck转译器中printf/puts调用失败的疑问与解答

我在实现Brainfuck解释器与转译器时,通过一系列printf()/puts()调用生成目标代码,核心逻辑代码如下:

while (ip < ops->count) {
        Op op = ops->items[ip];

        switch (op.kind) {
            case '+':
                printf("    t.mem[t.head] += %zu;\n", op.operand);
                ++ip;
                break;
            case '-':
                printf("    t.mem[t.head] -= %zu;\n", op.operand);
                ++ip;
                break;
            case '.':
                printf("    xputchar_many(&t, %zu);\n", op.operand);
                ++ip;
                break;
            case ',':
                printf("    xgetchar_many(&t, %zu);{\n", op.operand);
                ++ip;
                break;
            case '>':
                printf("    t.head += %zu;\n\n"
                       "    grow_tape_and_append_many_zeroes(&t);\n", op.operand);
                ++ip;
                break;
            case '<':
                printf("    t.head = t.head < %zu ? t.count - (%zu - t.head) : t.head - %zu;\n",
                       op.operand, op.operand, op.operand);
                ++ip;
                break;
            case '[':
                puts("    while (t.mem[t.head] != 0) {");
                ++ip;
                break;
            case ']':
                puts("    }");
                ++ip;
                break;
        }
    }

针对这段代码,我有两个技术疑问:

  1. 当printf()调用失败(返回负整数)或puts()调用失败(返回EOF)后,是否存在恢复的可能?
  2. 如果无法恢复,退出前调用fprintf(stderr, ...)输出错误信息是否仍有意义?

解答

  1. 是否可以恢复:确实没有实用的恢复可能。这类输出失败通常源于标准输出流(stdout)出现严重问题,比如管道被关闭、磁盘空间耗尽、输出设备断开等。此时流的状态已处于错误或结束状态,即便调用clearerr(stdout)清除错误标志,后续输出操作大概率仍会失败,且已生成的目标代码不完整,无法保证正确性,继续执行只会生成残缺的无效代码,没有实际价值。

  2. 输出错误信息是否有意义:非常有意义。虽然程序无法完成转译任务,但向标准错误流(stderr)输出明确的错误信息(如"输出失败:磁盘空间不足""无法写入标准输出"),能让用户清晰知晓问题根源,而非困惑于程序无征兆退出或得到残缺输出。stderr默认无缓冲,且与stdout是独立流,即便stdout故障,stderr大概率仍能正常输出,帮助用户排查问题。


内容的提问来源于stack exchange,提问作者Madagascar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 23:21:20