如何根据用户在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::hex
和std::setprecision
修饰符可能更适合此任务。
std::printf
与用户定义的字符串一起使用是不安全的,但是有一些c++实现为相同格式的字符串提供了类型安全的替代方案:
也有std::vformat
,但这并不使用printf
风格的格式字符串。
一个fmtlib示例如下:
std::string format;
std::cin >> format;
try
{
fmt::printf(format, 100);
}
catch (std::exception&)
{
std::cout << "invalid format stringn";
}