在C语言中将字符数组打印成十六进制

5

我有一个名为char **str的二维数组(通过malloc分配)。假设str[0]包含字符串"hello",如何打印出该字符串的十六进制表示?

我尝试了printf("%d\n", (unsigned char)strtol(str[0], NULL, 16)),但它并没有以十六进制形式打印出来。

谢谢您提供帮助!


2个回答

8

您对 strtol 的功能感到困惑。如果您有一个表示十六进制数字的字符串,可以像下面这样使用 strtol

char s[] = "ff2d";
int n = strtol(s, NULL, 16);
printf("Number: %d\n", n);

当您想要将字符串中的字符以十六进制形式打印时,请使用%x格式说明符来处理字符串的每个字符。

char s[] = "Hello";
char* cp = s;
for ( ; *cp != '\0'; ++cp )
{
   printf("%02x", *cp);
}

谢谢!但是 %2x 中的 2 是什么意思?如果我把它去掉,它还是打印相同的十六进制数。 - neby
这意味着使用宽度为2来打印数字。实际上应该是%02x,这样如果数字小于16,则会打印前导零。 - R Sahu

5
使用%x标志打印十六进制整数。 example.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) 
{
  char *string = "hello", *cursor;
  cursor = string;
  printf("string: %s\nhex: ", string);
  while(*cursor)
  {
    printf("%02x", *cursor);
    ++cursor;
  }
  printf("\n");
  return 0;
}

输出

$ ./example 
string: hello
hex: 68656c6c6f

参考资料


谢谢你!这些链接真的很有帮助,看到不同的方法做同样的事情总是很好。另外,上面的问题是什么意思,%02x中的02是什么? - neby
02 只是用于补零,因此如果十六进制整数长度小于 2 字节,例如 9,则会打印 09。对于字母字符来说并不是必需的,因为它们都在两个字节的十六进制范围内。 - amdixon
1
你能解释一下 cursor 是什么吗?另外,如果你不把 *string 改成 string[] 的话,这会导致编译器报错。 - not2qubit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接