我试图用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++;
}
}
Run Code Online (Sandbox Code Playgroud)
并且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);
}
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?我如何得到 \x0a?
编辑:我不能使用printf(). 我仅限于write().
而是在str[i]超出可打印范围时写一个字符,形成一个小字符串并写下来。
// if (str[i] <= 31 || str[i] == 127)
if (str[i] <= 31 || str[i] >= 127) {
unsigned char a = str[i];
char buf[5];
int len = sprintf(buf, "\\x%02X", a);
// write(1, &a, 1);
write(1, buf, len);
}
Run Code Online (Sandbox Code Playgroud)
我只能写()
如果sprintf()不可用:
// int len = sprintf(buf, "\\x%02X", a);
buf[0] = '\\';
buf[1] = 'x';
buf[2] = "0123456789ABCDEF"[a/16];
buf[3] = "0123456789ABCDEF"[a%16];
buf[4] = '\0';
len = 4;
Run Code Online (Sandbox Code Playgroud)
先进的:
char可能是unsigned,因此值可能大于 127。
为了很好地逆转这个过程,\\以十六进制打印可能是有意义的。
if (str[i] <= 31 || str[i] >= 127 || str[i] == '\\') {
Run Code Online (Sandbox Code Playgroud)