c - 如何写()\ 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()
。
解决方案
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] == '\\') {
推荐阅读
- angular - 为什么我的“for”循环函数在 sass 中不起作用?
- ionic-framework - Ionic3:无法声明 InAppBrowser
- java - 蚂蚁模式配置
- elasticsearch - 如果在 Web 服务器端删除了以前的“FETCHED”url,StormCrawler 再次访问它,会发生什么情况?
- java - 使用弹簧在数据库上搜索参数
- java - 自动增量归档不返回值(非主键) - Spring Boot JPA
- intellij-idea - CucumberJvmSMFormatter:启动失败
- html - 在 iOS 上显示“传统”html 选择列表
- angularjs-ng-model - 更改下拉/选择的值时,Angularjs 不会更新 ng-model 值
- botframework - 如何从 BotTelemetryClient.TrackEvent() Microsoft.Bot.Builder 填充 session_id