C++ 在调用std::to_chars之前,我如何知道要分配多少个char?

C++ 在调用std::to_chars之前,我如何知道要分配多少个char?,c++,c++17,C++,C++17,关于std::to_chars的例子很少,我在参考资料中只找到了一个例子: int main() { std::array<char, 10> str; if(auto [p, ec] = std::to_chars(str.data(), str.data() + str.size(), 42); ec == std::errc()) std::cout << std::string_view(str.data(), p

关于
std::to_chars
的例子很少,我在参考资料中只找到了一个例子:

int main()
{
    std::array<char, 10> str;

    if(auto [p, ec] = std::to_chars(str.data(), str.data() + str.size(), 42);
       ec == std::errc())
        std::cout << std::string_view(str.data(), p - str.data());
}

如果不知道大小,可以使用
std::string

#include <iostream>
#include <string>

int main() {
  int const i = 42;
  auto const str = std::to_string(i);
  std::cout << str;
}
#包括
#包括
int main(){
int const i=42;
自动常量str=std::to_字符串(i);

std::cout此函数专为某些高速转换而设计,没有太多开销。它将检查溢出并返回错误代码。但是,如果您想提前知道转换将产生多少字符,可以使用

std::numeric_limits<float>::max_digits10
std::数值限制::最大数字10
所以你的代码看起来像这样

#include <iostream>
#include <array>
#include <charconv>

int main()
{
    std::array<char, std::numeric_limits<float>::max_digits10> str;

    float v = 1000000.0 + 1.0 / 3.0;

    if (auto [p, ec] = std::to_chars(str.data(), str.data() + str.size(), v);ec == std::errc())
        std::cout << std::string_view(str.data(), p - str.data());
}
#包括
#包括及


请注意:如果要使用
std::string
及其底层缓冲区,则必须在
std::numeric\u limits::max\u digits10
resize
函数中添加1。但是,我不建议直接使用
std::string
的底层缓冲区。

使用
stringstream
并使存储器自行调整大小。对于以N为基数打印数字,您可以获取输入的第N个日志并添加1,以了解您需要多少位数字。例如,log10(1000)=3.不确定这是否是你要问的。@wobr我想转换
float
s。我在问题中添加了一些信息。根据@Ayxan的回答,使用to_stringRight。任何东西都比预先分配的固定大小的缓冲区好。固定大小只是一个等待发生的错误。这个规则的例外很少。但是,我不建议直接使用std::string的底层缓冲区。“为什么不呢?这就是添加
数据的目的。它是一个连续的字符数组,所以使用它是完全合法的代码。@Nicolas它真的是一个数组吗?我不认为它是数组类型。更像是一个连续的内存块。@Ayxan:它真的是一个数组吗?“是的。标准要求
basic_string
存储一个数组。标准要求字符串中任何指向字符的指针的工作方式与指向该大小数组中字符的指针的工作方式完全相同。”我认为它不是数组类型。“不必如此。标准要求字符串中字符的指针工作正常。@Nicolas所以它是数组,但不是数组类型
#include <iostream>
#include <array>
#include <charconv>

int main()
{
    std::array<char, std::numeric_limits<float>::max_digits10> str;

    float v = 1000000.0 + 1.0 / 3.0;

    if (auto [p, ec] = std::to_chars(str.data(), str.data() + str.size(), v);ec == std::errc())
        std::cout << std::string_view(str.data(), p - str.data());
}