【问题标题】:C - converting hex to stringC - 将十六进制转换为字符串
【发布时间】:2018-06-06 21:35:09
【问题描述】:

关注一个老问题Converting hex to string in C?

批准的答案建议使用 sprintf 将每个十六进制转换为字符串。

我对此有两个问题 -

1) 当我有一个像0a 这样的十六进制时,我希望我的字符串也有0a,但是按照上述解决方案,结果将有a

2) 我在这里做错了什么?

#include <stdio.h>

int main(void)
{
    unsigned char readingreg[10];
    readingreg[0] = 0x4a;
    readingreg[1] = 0xab;
    readingreg[2] = 0xab;
    readingreg[3] = 0x0a;
    readingreg[4] = 0x40;
    unsigned char temp[10];
    int i = 0;

    while (i < 5)
    {
        sprintf(temp + i, "%x", readingreg[i]);
        i++;
    }
    printf("String: %s\n", temp);
    return 0;
}

o/p 似乎是 - String: 4aaa40

3) 结合这两个问题,我希望我的结果字符串为4aabab0a40

TIA

【问题讨论】:

  • sprintf(temp + 2*i, "%02x", readingreg[i]); 和:unsigned char temp[10+1];(但最好使用 sprintf() 的返回值,或者:甚至使用 snprintf())
  • 1) 毫无疑问。 3) 毫无疑问。 2) 超出了 SO 的范围。

标签: c arrays string printf


【解决方案1】:

您的代码有几个问题。

第一个 unsigned char temp[10]; 应该是 unsigned char temp[11]; 以包含字符串终止符。

接下来是格式规范 "%x" 应该是 "%02x" 所以每个值都是 2 位数字。

那么temp + i 应该是temp + i*2,所以每对数字都写在正确的位置。

纠正这些错误:

#include <stdio.h>

int main(void)
{
    unsigned char readingreg[10];
    readingreg[0] = 0x4a;
    readingreg[1] = 0xab;
    readingreg[2] = 0xab;
    readingreg[3] = 0x0a;
    readingreg[4] = 0x40;
    unsigned char temp[11];
    int i = 0;

    while (i < 5)
    {
        sprintf(temp + i*2, "%02x", readingreg[i]);
        i++;
    }
    printf("String: %s\n", temp);
    return 0;
}

现在需要程序输出

字符串:4aabab0a40

【讨论】:

  • 被用作虚构字符串的数组是否不应该是编译器默认的char 类型?
  • @usr2564301 编译器的默认char 类型很可能是无符号的。如果您愿意,C 中的字符串是“虚构的”,C 没有字符串类型。它们是带有 nul 终止符的数组。
  • 这对 OP 的代码或您的答案无关紧要,但仍然 :) 字符串函数的常用原型仅提及 char,也就是说,它们确实遵守编译器默认值。这就是为什么我提到它,作为对 OP 的警告——手动覆盖 either signedunsigned 可能会触发警告。
猜你喜欢
  • 2018-01-31
  • 2014-06-09
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 2022-07-22
  • 2013-02-07
  • 2017-08-12
  • 2017-02-23
相关资源
最近更新 更多