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

如何用C语言低级write函数输出指针指向的数值?

问题分析与解决

你的代码输出*是因为ASCII码映射的问题,而printf和write的工作逻辑完全不同:

  • printf("%d", *nbr)会自动把整数42转换成十进制数字对应的字符序列"42",也就是输出ASCII码为52(对应'4')和50(对应'2')的两个字符。
  • 你直接把int类型的42赋值给char,然后用write输出,本质是输出ASCII码为42的字符——而这个字符正好是*,所以结果符合ASCII规则,但不符合你想要输出数字的预期。

正确实现方式

要实现用write输出整数的十进制形式,需要手动把整数转换成对应的字符序列。比如对于正整数,可以通过取余和除法拆分每一位数字,再将每个数字加上'0'(ASCII码48)转换成对应的字符,最后输出。

修改后的代码示例:

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

void ft_ft(int *nbr) {
    int num = *nbr;
    char buffer[12]; // 足够存储int范围内的数字(含负号)
    int i = 0;

    // 处理0的特殊情况
    if (num == 0) {
        buffer[i++] = '0';
    } else {
        // 处理负数
        int is_negative = 0;
        if (num < 0) {
            is_negative = 1;
            num = -num;
        }

        // 拆分每一位数字,逆序存入buffer
        while (num > 0) {
            buffer[i++] = (num % 10) + '0';
            num /= 10;
        }

        // 如果是负数,添加负号
        if (is_negative) {
            buffer[i++] = '-';
        }
    }

    // 逆序输出buffer中的字符
    while (i > 0) {
        write(1, &buffer[--i], 1);
    }
    // 可选:输出换行符,和printf的\n对应
    write(1, "\n", 1);
}

int main() {
    int nbr = 42;
    ft_ft(&nbr);
    return 0;
}

关键说明

  • 每个数字字符的ASCII码 = 数字值 + '0'的ASCII码(比如4 + '0' = 52,对应字符'4')。
  • 拆分数字时会得到逆序的字符序列,所以需要逆序输出才能得到正确的数字顺序。
  • 代码中处理了0和负数的情况,覆盖了更多场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:30:07