【发布时间】:2021-07-08 19:38:21
【问题描述】:
我正在尝试 write() 的十六进制表示 \n 没有任何成功。
我有ft_putstr_non_printable.c的代码:
#include <unistd.h>
void ft_putstr_non_printable(char *str)
{
int i;
unsigned char a;
char c;
i = 0;
a = 0x0;
while (str[i] != '\0')
{
if (str[i] <= 31 || str[i] == 127)
{
a = str[i];
write(1, &a, 1);
}
else
{
c = str[i];
write(1, &c, 1);
}
i++;
}
}
还有main.c:
#include <stdio.h>
#include <string.h>
#include "ft_putstr_non_printable.c"
int main(void)
{
char a[] = "\n au revoir\a";
char b[] = "omellette du fromage\b";
char c[] = "coeuf@ca6va\e fef";
char d[] = " Batata \x7F rfg";
char e[] = "roquefort`[e{forte-e_tem,bolor \n feff";
char f[] = " we 9are 78familly \x1F rgfenf";
ft_putstr_non_printable(a);
ft_putstr_non_printable(b);
ft_putstr_non_printable(c);
ft_putstr_non_printable(d);
ft_putstr_non_printable(e);
ft_putstr_non_printable(f);
}
我做错了吗?如何获得 \x0a?
编辑:我不能使用printf()。我仅限于write()。
【问题讨论】:
-
嗯,
write(1, &a, 1);和write(1, &c, 1);基本上是相同的,所以你不会那样做。write不像printf。write是一个只写入原始字节的低级函数。要让\n以0a或0x0a出现,意味着您将不得不写入两个或更多字节,而这反过来意味着您将不得不以某种方式构造这两个或更多字节。如果允许,最简单的方法是sprintf。 -
打印
\n(以及任何字符)的十六进制表示:printf("%02x", '\n'); -
研究字符串库。
-
如果您出于某种原因试图避免使用
printf,那么您正在寻找诸如itoa之类的将数字转换为字符串的函数。然后你必须显式打印每个字符 -
建议:不要像
#include "ft_putstr_non_printable.c"那样使用#include.c文件