如何将固定长度的char *转换为数字或将非空终止的char *转换为数字?

时间:2019-04-12 15:52:25

标签: c++

MYSQL_HOST=db
MYSQL_DATABASE=cloud
MYSQL_USER=cloud
MYSQL_PASSWORD=@nextcloud
NEXTCLOUD_ADMIN_USER=admin
NEXTCLOUD_ADMIN_PASSWORD=@password
NEXTCLOUD_TRUSTED_DOMAINS=cloud.me

我在这里有两个问题。

  1. 如何将定长group转换为数字? 在上面的示例中,我们需要将前两个十六进制字符提取为整数。由于#include <iostream> // std::cout #include <string> // std::string, std::stoi int main () { const char* arrNumber = "ff000A;"; const std::string firstNum = std::string(arrNumber, 2); const std::string secondNum = std::string(arrNumber+2, 4); const int i_first = std::stoi(firstNum, nullptr, 16); const int i_second= std::stoi(secondNum, nullptr, 16); std::cout << "i_first: " << i_first << std::endl; std::cout << "i_second: " << i_second << std::endl; return 0; } 的构造,所提出的方法很慢,我正在寻找与以下原型相似的更好的解决方案。

    char*

    鉴于此原型,上面的示例可以写成如下:

    std::string
  2. 如何将不带空终止符的 stoi_x(const char* start_, size_t len, int base = 10) 转换为数字?同样,我正在寻找与以下原型类似的更好解决方案。

     const int i_first = stoi_x(arrNumber, 2, 16);
    

    鉴于此原型,上面的示例可以写成如下:

    char*

1 个答案:

答案 0 :(得分:5)

您可以使用std::from_chars,它将带您直接使用。它使用指向开始元素的指针和指向最后一个元素的指针,然后将其转换为数字。如果它根本无法转换字符串,它将在返回对象中填充错误代码,否则它将转换它可以转换的内容,并返回一个指向返回对象中无法转换的数据部分的指针。在代码中使用它会将其更改为

int main ()
{
    const char* arrNumber = "ff000A;";

    int i_first, i_second;
    std::from_chars(arrNumber, arrNumber + 2, i_first, 16);
    std::from_chars(arrNumber + 2, arrNumber + 6, i_second, 16); 

    std::cout << "i_first: " << i_first << std::endl;
    std::cout << "i_second: " << i_second << std::endl;
    return 0;
}

如果您不喜欢这样,就不能将转换结果分配给常量变量,则可以将其包装在自己的函数中,例如

template<typename T>
auto from_chars(char const * begin, char const * end, int base = 10)
{
    T ret{};
    std::from_chars(begin, end, ret, base);
    return ret;
}

然后您可以像使用它

int main ()
{
    const char* arrNumber = "ff000A;";

    const int i_first = from_chars<int>(arrNumber, arrNumber + 2, 16);
    const int i_second = from_chars<int>(arrNumber + 2, arrNumber + 6, 16);

    std::cout << "i_first: " << i_first << std::endl;
    std::cout << "i_second: " << i_second << std::endl;
    return 0;
}

请注意,我没有进行任何错误处理。在生产代码中,您应该检查是否发生错误,因为std::from_chars不会引发任何异常。