【问题标题】:How to convert an unsigned long long with leading zeroes to string?如何将带有前导零的 unsigned long long 转换为字符串?
【发布时间】:2019-09-20 07:34:08
【问题描述】:

我有一个函数应该以十六进制格式的 unsigned long long 作为参数。我正在尝试将此参数转换为字符串以检查它是否由 16 位数字组成,但我遇到了前导零问题

template <typename T>
static string to_string(const T& value) {
stringstream oss;
oss << hex << setprecision(16) << value;
return oss.str();
}

int main(int argc, char** argv) {

    unsigned long long pattern1 = 0x0000001000000002;
    unsigned long long pattern2 = 0x0FFFFFFFFFFFFFFFF;

    cout << "Pattern 1 = " << to_string(pattern1) << endl;
    cout << "Pattern 2 = " << to_string(pattern2) << endl;

    return 0;
}

我想要的是用零转换模式 1 以便能够检查它的长度,但这是输出。我尝试使用设置的精度,但似乎没有帮助

Pattern 1 = 1000000002
Pattern 2 = ffffffffffffffff

【问题讨论】:

  • 不可能。内存中前导零的数量由类型的大小决定。
  • 我不明白你在问什么。您要在字符串中添加多少个前导零?
  • @melpomene 我不想加零,我只想检查十六进制格式的unsigned long long 的长度
  • Any unsigned long long 在您使用的编译器中将有 16 个十六进制数字。你不需要检查它的长度。如果这是参数的签名,编译器将确保您的方法接收到 unsigned long long。不清楚你在问什么。
  • 小数位数没有前导零由log10(value)+1给出。无需字符串转换。但这不是你要求的。

标签: c++ c++98


【解决方案1】:

你知道一个数字应该包含多少个字符吗?前导零的数量可以是无限的。我认为这对你有帮助

int character_count = 10;
oss << hex << setfill('0') << setw(character_count) << value;

【讨论】:

  • 这会将pattern1的大小更改为等于character_count。我想要的是计算用户输入了多少位数。在您的情况下,0x0010002 将打印为 0000010002
  • @HasanH 你的问题是,“用户”根本没有输入任何数字。
  • @YSC 假设 pattern1 是某个函数中的一个参数,我想用它的前导零检查它的大小。
  • 如果您想知道用户输入了多少位数,则必须以 string 或 char* 格式读取,因为 long long 不存储有关前导零的信息。
【解决方案2】:

您无法知道“用户输入”的位数,除非您已经通过“数组”(char*std::string、...)读取它.

如果您有unsigned long long,则变量大小无论如何都会是8 字节:

unsigned long long a = 0x1; // This will internally be: 0x0000000000000001

现在,如果您想从std::string 中的实际类型中取回前导零,我认为以下方法应该可以解决问题(正如其他答案已经提到的那样):

template <typename T>
std::string to_string(const T & val)
{
    std::stringstream oss;
    oss << std::hex << std::setfill('0') << std::setw(sizeof(T)*2) << val;
    return oss.str();
}

但也许最好为您想要使用的任何整数类型重载该函数,而不是使用template
因为如果有人用不是shortintlonglong long(分别是unsigned)的类型调用函数,函数就会被破坏。

【讨论】:

    【解决方案3】:

    以十六进制数表示的unsigned long long 的长度(包括前导零)为:

    sizeof(unsigned long long)*2
    

    由于我们包含前导零,unsigned long long 的值不相关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 2016-04-19
      相关资源
      最近更新 更多