10

这种以十六进制打印字符串的简短方法是否正确?如果不是,应该如何解决?

uint8_t *m = string;
int c = sizeof(string);
while(c--){
    printf("%02x ", *(m++));
}
4

2 回答 2

21

没有“oneliner”,没有。此外,您的代码看起来已损坏。

你不能那样使用sizeof,你可能是说strlen().

为了安全起见,您需要将字符转换为无符号类型。

所以,像这样的东西,也许:

void print_hex(const char *s)
{
  while(*s)
    printf("%02x", (unsigned int) *s++);
  printf("\n");
}

请注意,我调用strlen(),因为一次就可以遍历字符串两次是没有意义的。:)

于 2012-10-04T10:20:18.253 回答
3

我认为从技术上讲,“字符串”在这里具有误导性;您似乎正在打印一个值数组(不一定以空结尾)uint8_t

无论如何,您都需要一个循环。如果你可以使用 C99,你可以写

for (size_t i = 0; i < sizeof(string); ++i) printf("%02x", string[i]);

如果数组空终止的,并且您不需要的原始值string(这通常是按值传递指针时的情况),您可以

static void printArray(const uint8_t *string)
{
  while (*string) printf("%02x", *string++);
}
于 2012-10-04T10:30:49.000 回答