使用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来攻击我,但不管怎么说,这个答案的措辞很清楚,好像我需要把字符转换成整数。我确实明白了,无论如何,我都会用这个来做相反的事情。不管怎样,谢谢你。我也是。你解决问题了吗?