[英]Print all elements of an hex array in one line
我在C char arr[100]
有一个数组,其中每个元素都可以包含一个任意的十六进制值(甚至为0)。 我想以某种方式能够在一行中打印此数组,例如:
arr[0] = 0x11
arr[1] = 0x00
...
arr[99] = 0x22
输出应为:
0x11 0x00 ..... 0x22
如果我将printf()
与%s
,它将在0处停止。我不想使用for
循环使用%x
逐个打印每个字符。 由于要使用的系统,我对可以使用哪个API有所限制。 它不允许printf()
。 它具有一个函数print()
,它在每次打印后都会添加新行,但是可以接受%x, %s, %d
等格式字符串%x, %s, %d
例如printf()
。
如何达到要求?
您可以设计自己的函数来首先构造一个字符串,然后立即打印它。 您可以按照以下方式进行操作:
void print_array(char arr[], int len) {
if(len <= 0){
print("");
return;
}
char output[len*5];
int i;
for(i=0;i<len;i++) {
output[i*5]='0';
output[i*5+1]='x';
int upper = (unsigned char)arr[i] / 16;
int lower = (unsigned char)arr[i] % 16;
output[i*5+2] = upper < 10?(upper + '0'):(upper-10+'a');
output[i*5+3] = lower < 10?(lower + '0'):(lower-10+'a');
output[i*5+4] = ' ';
}
output[i*5-1]=0;
print("%s", output);
}
显然,这对字符宽度和编码做出了一些假设。 但您可以根据自己的目标进行调整。
这是一个正在运行的演示 。
您可以使用sprintf
复制到缓冲区中,然后打印缓冲区
#include <stdio.h>
int main(void)
{
char arr[] = { 0x11, 0x00, 0x22, 0xFF };
int count = sizeof(arr);
//each element needs 5 bytes
char *buf = malloc(5 * count + 1);
for(int i = 0; i < count; i++)
sprintf(buf + i * 5, "0x%02X ", arr[i] & 0xFF);
//optional: remove the last blank space
buf[5 * count - 1] = 0;
printf("[%s]\n", buf);//or whichever print function available
return 0;
}
到目前为止,最简单的方法就是使用递归。 实际上,可以通过仅使用main函数并将索引声明为全局变量来进一步压缩以下程序。
#include <stidio.h>
//declare your array and its size as a global varaible
int arrSize = 5;
unsigned char arr[5] = {0x00, 0x11, 0x1F, 0x33, 0x34};
void recursion(int i) {
if(i == 0){
printf("0x%x0 ", arr[i]);
}else{
printf("0x%x ", arr[i]);
}
if(i < arrSize -1){ //at index i, if i is less than the length of your array
i += 1;
recursion(i); //then recurse to the next index
}else{
printf("\n");
}
}
int main() {
recursion(0); //call your recursive function in main()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.