如何用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
相关产品推荐
相关产品推荐

