2

除了最常见的(格式)函数外,C++20 还附带了 format_to_n,它接受输出迭代器和计数。

我正在寻找的是确保万一我的空间用完我的字符串仍然为零终止的方法。例如,我希望以下程序输出 4 而不是 42。

#include<string>
#include<iostream>
#define FMT_HEADER_ONLY 
#include <fmt/format.h>
void f(char* in){
    fmt::format_to_n(in, 2,"{}{}", 42,'\0');
    std::cout << in;
}

int main(){
    char arr[]= "ABI";
    f(arr);
}

如果我不手动比较我提供给函数的写入字符数和最大长度,这是否可能?

如果您想知道为什么我使用 '\0' 作为参数:

我不知道如何将终止字符放入格式字符串中。

注意:我知道对于一个参数,我可以用 : 指定 max len。但我想要一个适用于多个参数的解决方案。

4

2 回答 2

5

format_to_n返回一个结果。您可以使用该结构:

void f(char* in){
    auto [out, size] = fmt::format_to_n(in, 2, "{}", 42);
    *out = '\0';
    std::cout << in;
}

请注意,这可能会写入"42\0"in因此请酌情调整容量(2对于大小的缓冲区3是正确的)。

于 2020-02-28T14:36:56.617 回答
2

format_to_n返回一个结构,其中包含最后一个写入字符的迭代器。因此,很容易根据最大字符数检查该迭代器和原始迭代器之间的差异,并\0在适当的地方插入 a:

void f(char* in)
{
  const max_chars = 2;
  auto fmt_ret = fmt::format_to_n(in, max_chars,"{}", 42);
  char *last = fmt_ret.out;
  if(last - in == max_chars)
    --last;
  *last = '\0';

  std::cout << in;
}

请注意,这假定数组仅包含您尝试传递给的数字的字符数(包括format_to_nNUL 终止符) 。因此,上面的代码将覆盖用 NUL 终止符写入的最后一个字符,本质上是进一步截断。

相反,如果您传递给format_to_n数组中的字符数 - 1,那么您可以简单地将 NUL 终止符写入fmt_ret.out自身。

于 2020-02-28T14:29:12.037 回答