= 16) { a = hex[str / 16]; b = hex[str % 16]; write(1, &a, 1); write(1, &b, 1); } else { a = hex[str % 16]; write(1, &a, 1); } } void ft_putstr_non_printable(char *str) { int i; i = 0; while (str[i] != '\0') { if (str[i] >= 0 && str[i] <= 31) { write(1, "\\", 1); write(1, "0", 1); char_to_hex(str[i]); } else { write(1, &str[i], 1); } i++; } } int main() { char a[] = "ABCde\n\tfGHI"; ft_putstr_non_printable(a); return 0; }"> = 16) { a = hex[str / 16]; b = hex[str % 16]; write(1, &a, 1); write(1, &b, 1); } else { a = hex[str % 16]; write(1, &a, 1); } } void ft_putstr_non_printable(char *str) { int i; i = 0; while (str[i] != '\0') { if (str[i] >= 0 && str[i] <= 31) { write(1, "\\", 1); write(1, "0", 1); char_to_hex(str[i]); } else { write(1, &str[i], 1); } i++; } } int main() { char a[] = "ABCde\n\tfGHI"; ft_putstr_non_printable(a); return 0; }"> = 16) { a = hex[str / 16]; b = hex[str % 16]; write(1, &a, 1); write(1, &b, 1); } else { a = hex[str % 16]; write(1, &a, 1); } } void ft_putstr_non_printable(char *str) { int i; i = 0; while (str[i] != '\0') { if (str[i] >= 0 && str[i] <= 31) { write(1, "\\", 1); write(1, "0", 1); char_to_hex(str[i]); } else { write(1, &str[i], 1); } i++; } } int main() { char a[] = "ABCde\n\tfGHI"; ft_putstr_non_printable(a); return 0; }">
#include <stdio.h>

#include <unistd.h>

void	char_to_hex(char str)
{
	char		a;
	char		b;
	int			i;
	const char	hex[20] = "0123456789abcdef";

	i = 0;
	if (str >= 16)
	{
		a = hex[str / 16];
		b = hex[str % 16];
		write(1, &a, 1);
		write(1, &b, 1);
	}
	else
	{
		a = hex[str % 16];
		write(1, &a, 1);
	}
}

void	ft_putstr_non_printable(char *str)
{
	int	i;

	i = 0;
	while (str[i] != '\\0')
	{
		if (str[i] >= 0 && str[i] <= 31)
		{
			write(1, "\\\\", 1);
			write(1, "0", 1);
			char_to_hex(str[i]);
		}
		else
		{
			write(1, &str[i], 1);
		}
		i++;
	}
}
int main() {
    char a[] = "ABCde\\n\\tfGHI";
    
    ft_putstr_non_printable(a);
    
    return 0;
}

수정사항: 확장 아스키 코드 값도 고려해서 unsigned char 값으로 형 변환 시켜야 함.

#include <unistd.h>

void	char_to_hex(unsigned char str)
{
	unsigned char		a;
	const char			hex[20] = "0123456789abcdef";

	if (str >= 16)
	{
		a = hex[str/16];
	}
	else
	{
		a = hex[str];
		write(1, &a, 1);
	}
}

void	ft_putstr_non_printable(char *str)
{
	int	i;

	i = 0;
	while (str[i] != '\\0')
	{
		if ((str[i] >= 0 && str[i] <= 31) || (str[i] > 127))
		{
			write(1, "\\\\", 1);
			write(1, "0", 1);
			char_to_hex((unsigned char)(str[i]));
		}
		else
		{
			write(1, &str[i], 1);
		}
		i++;
	}
}
// c02 test code - made by kyungjle

#include <stdio.h>

//void ft_putstr_non_printable(char *str);

int main(void)
{
	ft_putstr_non_printable("asdfa asdf");
	printf("\\n");
	ft_putstr_non_printable("as\\ndfa\\200 asdf\\x61");
	printf("\\n");
}

ASCII table - Table of ASCII codes, characters and symbols

#include <unistd.h>

void	char_to_hex(unsigned char b)
{
	const unsigned char	hex[] = "0123456789abcdef";

	write(1, &hex[(b / 16)], 1);
	write(1, &hex[(b % 16)], 1);
}

void	ft_putstr_non_printable(char *str)
{
	int	i;

	i = 0;
	while (str[i] != '\\0')
	{
		if ((str[i] >= 0 && str[i] <= 31) || ((unsigned char)str[i] >= 127))
		{
			write(1, "\\\\", 1);
			char_to_hex((unsigned char)str[i]);
		}
		else
		{
			write(1, &str[i], 1);
		}
		i++;
	}
}

이상하게 코드를 출력할 때마다 원래 출력되어야 할 수가 출력이 되지 않고 다른 숫자가 출력이 되어서 이상하다고 생각했는데, 아스키 코드 8번 이후 부터는 제대로 출력이 잘 안된다고 한다. 즉 코드(숫자)로 입력하면 오류가 발생한다는 얘기이다.

그래서 문자를 직접 넣어서 출력해 본 결과 정상적으로 출력이 되는 것을 확인했다.

왜 이걸 오늘에야 안 것인지 …..