如何按照用户在c++中输入的格式化方法对字符串进行格式化?



如何根据用户在c++中输入的格式化方法对字符串进行格式化?
例如,这里有一个整数:
int x = 100;
如果用户输入一个格式化方法(字符串):
"%x"
我想输出:0x40.

另一个用户输入一个格式化字符串:
%.4f
我希望它输出:100.0000.
怎么做?

我看到了以下两个概念:

1。

  • 从用户
  • 读取格式化字符串
  • 拒绝具有多个格式说明符的任何内容
  • 拒绝任何你想要输出的变量类型的错误格式说明符(例如,对整数使用float说明符是错误的;只是特别提一下,因为你的例子看起来像这样....)
  • 拒绝任何带有错误格式说明符的变量宽度(与上面相同,只是另一个细节)
  • 拒绝不尝试输出变量的错误说明符(有一些花哨/危险的事情可以用用户提供的字符串来完成…)
  • 删除除格式说明符以外的任何内容(假设您的意思是不允许"装饰")
  • 通过删除它来拒绝上面的内容并使用剩余的
  • 或拒绝,给出错误信息并要求另一个输入
  • 使用字符串作为输出
    • 为用户提供一个选择预定义的安全、适用的格式化选项

    出于安全和可靠性的考虑,我可能会选择选项2。

    printf接受任何字符串作为其第一个参数,而不仅仅是字符串字面量。只是要注意格式必须匹配参数。这使得它很容易出错。例如,指定%d并传递char是未定义的行为。

    int main(){
    std::string user_format = "%x";
    int x = 100;
    std::printf(user_format.c_str(),x);
    }
    

    std::hexstd::setprecision修饰符可能更适合此任务。

    std::printf与用户定义的字符串一起使用是不安全的,但是有一些c++实现为相同格式的字符串提供了类型安全的替代方案:

    <<ul>
  • 提升格式/gh>
  • fmtlib
  • 也有std::vformat,但这并不使用printf风格的格式字符串。

    一个fmtlib示例如下:

    std::string format;
    std::cin >> format;
    try
    {
    fmt::printf(format, 100);
    }
    catch (std::exception&)
    {
    std::cout << "invalid format stringn";
    }
    

    最新更新