【问题标题】:Decrement a hex value stored in a string [duplicate]减少存储在字符串中的十六进制值[重复]
【发布时间】:2019-10-12 10:51:22
【问题描述】:

假设我有:

char str[]="0x7fffffffe181"

基本上我想将十六进制减少到0x7fffffffe180。

我该怎么做?

注意:如果最后一个字符是字母,例如c,减量后应该是b

【问题讨论】:

  • 这些字符串是否表示可以放入 C 中的数字 long 或 unsigned long,或者它们可以像 0xf876c6784564645de653654ee65d56310913bbba0009897768b 那样任意长?
  • 我是教科书的算术题。你试过什么?
  • 祝你工作顺利。 :-)
  • 你的意思是str[strlen(str) - 1]--?
  • 转成long long int,递减,转回字符串。如何进行转换很容易在互联网上找到。

标签: c


【解决方案1】:

您可以将其转换为整数并返回如下:

char *str2;
unsigned long long int len, a = strtoull(str, NULL, 16);
a--;
len = snprintf(NULL, 0, "0x%llx", a);
str2 = malloc(len+1);
sprintf(str2, "0x%llx", a);

【讨论】:

  • 如果str 是"0x0" 会发生什么?我想结果不适合大小为 3 的 str2...
  • @StephanLechner 请查看更新。
  • @melpomene 感谢您的编辑。没听懂。
  • 它不是可移植的,但asprintf 会简化一点。
  • 我同意,但问题中没有指定操作系统。
【解决方案2】:

它只需要在 unsigned long long 的范围内工作。

const char *eptr;
unsigned long long numeric = strtoull(str, &eptr, 16);
if (eptr == str || numeric == 0) {
    /* handle error */
}
sprintf(str, "0x%llx", numeric - 1);

我们不能对有符号的十六进制执行此操作,因为递减 0 或某些负数会使字符串变长。

理论上,0 应该适用于 strtoull 的第三个参数,但它现在在我们的 libc 中存在问题,因此不能。

【讨论】:

  • strtoull 接受 3 个参数。 base 未声明。
  • @melpomene:已修复。我查看了 strtoull 并确认 0 做了我想要的,但仍然忘记输入它。 :(
  • @Joshua 您对strtoull 的使用非常错误。在尝试使用它之前,您应该阅读它。
  • 我还是不明白eptr == basecheck。
  • @Joshua 好的。我同意,这很难:)
猜你喜欢
  • 2013-07-04
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
相关资源
最近更新 更多