使用write syscall打印整数

使用write syscall打印整数,c,C,我想要相当于 void print3( char a, uint8_t b, int8_t c ) { printf("%c %" PRIu8 " %" PRIi8 "\n", a, b, c); } 使用writesyscall。问题是,我不知道如何使用write打印整数。仅允许来自ANSI C的命令,禁止使用sprintf格式化字符串 使用write的示例语法: const char msg[] = "Hello World!"; write(STDOUT_FILENO, msg,

我想要相当于

void print3( char a, uint8_t b, int8_t c )
{
    printf("%c %" PRIu8 " %" PRIi8 "\n", a, b, c);
}
使用
write
syscall。问题是,我不知道如何使用
write
打印整数。仅允许来自ANSI C的命令,禁止使用
sprintf
格式化字符串

使用write的示例语法:

const char msg[] = "Hello World!";
write(STDOUT_FILENO, msg, sizeof(msg)-1);

编辑:我不允许使用
sprintf
也不允许使用
itoa

要打印的数字的每个数字都表示为一个字符

解决方案有两个部分:

  • 计算所选基数中的数字,在本例中我假设为10

  • 将数字转换为字符并写入

对于计算数字的步骤,您将使用
/
%
运算符;这将以“相反”的顺序给出数字,因此您需要在写入之前将它们存储起来


将数字转换为字符时,考虑两种方法:简单算术(使用ASCII字符值)或数组查找。< /P> < P>考虑数字<代码> 155 /代码>,如果按<代码> 100 < /代码>进行划分,则有<代码> 1 <代码> 100,其余为<代码> 55 < /代码>除以

10
得到
5
10s,余数为
5
,除以
1
得到
5
。现在,将这些数字1-5-5串联起来,就得到了最终的数字。这应该可以让您开始了。

您必须自己进行转换。下面的代码将转换为ASCIIZ(C字符串),而不是简单的ASCII,但它是可用的:

int ltoa(long x, char *str, size_t str_size)
{
    long y = 1;
    size_t i, s;
    for (s = 0; y < x; s++)
        y *= 10;
    if (str_size < s+1)
        return s+1;
    str[s--] = 0x0;
    while(s)
    {
            str[s--] = '0' + (x % 10);
            x /= 10;
    }
    str[0] = '0' + x;
    return 0;
}
int-ltoa(长x,字符*str,大小)
{
长y=1;
尺寸i,s;
对于(s=0;y您知道
9(ascii)='0'+9

char a =0;
a = '0';
printf("%c",a); //will print 0
a = '0' + 8; 
printf("%c",a);//will print 8

编辑:

int a = 1234;
现在将其转换为
char*b
: 算法:

for each digit in a:
   b.append(digit+'0')

您必须了解
char
是一个包含
8位==byte
的容器,可以是数字、ASCII字母或任何您想在8位内表示的内容。因此,您需要自己进行字符串转换。它恰好是完全准确的。@Clash:我真的看不出还有什么要说的。在互联网上有数百个这样做的例子。到目前为止你试过什么?你被困在哪里?我不怀疑它的准确性@WhozCraig,这正是我被困的地方。我不能用sprintf。我不能用原子弹。我该如何将整数转换成字符*?哦,愚蠢的约束。查看
atoi
或自己尝试转换数字(提示:如何将数字转换为基数10?)。伙计,我需要将整数转换为字符,而不是将字符转换为整数。但是谢谢你的帮助。@Clash buddy,你不明白的是字节就是字节,还有同样的问题,你如何对待它们。。。一次是字母,一次是字符,一次是数字,一次是整数……我没有像你一样用buddy来攻击我,但不管怎么说,这个答案的措辞很清楚,好像我需要把字符转换成整数。我确实明白了,无论如何,我都会用这个来做相反的事情。不管怎样,谢谢你。我也是。你解决问题了吗?