首页 > 解决方案 > 如何写()\ n的十六进制表示?

问题描述

我试图以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()

标签: cgcc

解决方案


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);
    }

我仅限于 write()

如果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;

先进的:

char可能是unsigned,因此高于 127 的值是可能的。

为了很好地扭转这个过程,打印十六进制可能是有意义的\\

    if (str[i] <= 31 || str[i] >= 127 || str[i] == '\\') {

推荐阅读