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

C语言fprintf基础实现遇write函数参数类型不兼容问题求助

解决myfprintf实现中的类型错误与逻辑问题

核心问题分析

  • write参数类型不匹配:write的第二个参数要求是const void*类型,但你代码中用*(int*)value把指针解引用成了具体数值(如int、float),这直接导致类型不兼容。正确做法是传递转换后的指针,而非解引用后的值。另外要注意:直接写入二进制数据和标准fprintf的文本输出逻辑完全不同,fprintf是将数值转为可读字符串输出,而非原始二进制。
  • strcmp判断逻辑颠倒:strcmp返回0表示两个字符串完全相等,你的代码中if(strcmp(format,"%d"))会在字符串不相等时执行分支,这和预期完全相反,应改为if(strcmp(format,"%d") == 0)或if(!strcmp(format,"%d"))。

方案1:输出二进制数据(仅对应write原始行为,非fprintf文本输出)

修正类型与逻辑后的代码:

#include <string.h>
#include <unistd.h>

void myfprintf(int fd, char *format, void * value) {
    if (strcmp(format, "%d") == 0) {
        write(fd, value, sizeof(int)); // 直接传递指针,无需解引用
    }
    if (strcmp(format, "%f") == 0) {
        write(fd, value, sizeof(float));
    }
    if (strcmp(format, "%lf") == 0) {
        write(fd, value, sizeof(double));
    }
}

注意:此版本写入的是变量的原始二进制数据(比如int 123会写入对应字节的二进制值),而非可读的字符串"123",和标准fprintf行为不符。


方案2:实现类似fprintf的文本格式化输出(符合你的目标)

要输出可读文本,需先将数值转为字符串,再写入文件描述符,可通过sprintf完成格式化:

#include <string.h>
#include <unistd.h>
#include <stdio.h>

void myfprintf(int fd, char *format, void * value) {
    char buf[64]; // 缓冲区大小可根据需求调整
    int len;

    if (strcmp(format, "%d") == 0) {
        len = sprintf(buf, "%d", *(int*)value);
        write(fd, buf, len);
    } else if (strcmp(format, "%f") == 0) {
        len = sprintf(buf, "%f", *(float*)value);
        write(fd, buf, len);
    } else if (strcmp(format, "%lf") == 0) {
        len = sprintf(buf, "%lf", *(double*)value);
        write(fd, buf, len);
    }
}

此版本先通过sprintf将数值格式化为字符串存入缓冲区,再用write输出,行为更接近标准fprintf。同时用else if避免不必要的判断,提升效率。

内容的提问来源于stack exchange,提问作者Валентин Д.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:36:15