在一个相关的问题(“ std::string 格式,如 sprintf ”)中,我了解了这个很棒的新 C++20 标头<format>。
但是,似乎没有支持 compiler。这是正确的还是有办法使用它?
我正在使用带有-std=c++2a标志的g++ 9.3,但<format>无法识别库。
#include <format> // fatal error: format: No such file or directory
#include <iostream>
int main(){
std::cout << std::format("Hello {}!", "World");
}
Run Code Online (Sandbox Code Playgroud)
g++-9 test.cpp -o test -std=c++2a
我javascript可以使用格式化字符串template string
const cnt = 12;
console.log(`Total count: ${cnt}`);
Run Code Online (Sandbox Code Playgroud)
如果我与我一起工作,python我可以使用f-string:
age = 4 * 10
f'My age is {age}'
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用C++(17)什么是最好的解决方案(如果可能的话)?
我正在尝试创建一个函数,该函数采用可变数量的std :: string参数并使用它格式化字符串。
例:
Test::formatLine(const string::format, ...)
{
const std::string buffer;
va_list args;
va_start(args, format);
vsprintf(buffer.c_str, format.c_str, args);
va_end(args);
cout << buffer << endl;
}
Run Code Online (Sandbox Code Playgroud)
编译此代码段错误:
Error 1 error C3867: 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>::c_str': function call missing argument list; use '&std::basic_string<char,std::char_traits<char>,std::allocator<char>>::c_str' to create a pointer to member
Run Code Online (Sandbox Code Playgroud)
我要实现的目标:
Test t = Test();
t.formatLine("Hello %s!", "monsieur");
Run Code Online (Sandbox Code Playgroud)
应该打印 Hello monsieur!
t.formatLine("Hello %s %s! How %s you today?", "good", "sir", "are");
Run Code Online (Sandbox Code Playgroud)
应该打印 Hello good sir! How are you today?
它甚至有可能使用va_list,并vsprintf与std::string只,避免 …
这对我来说有点冗长:
ostrstream ss;
ss << "Selected elements: " << i << "," << j << ".";
string msg(ss.str(), (size_t)ss.pcount());
Run Code Online (Sandbox Code Playgroud)
是否有一种优雅的方法来使用简洁的单行语句(可能带有模板或宏)来格式化文本消息?
我有一个与std::string 格式非常相似的问题,例如 sprintf或这个问题,但这些问题非常旧,所以我敢于重试以收集一些方法。
我想要一个函数/方法,它接受参数来定义带有一些变量的格式化字符串,很像printf/ sprintf。例如,它可以是一种send_string(ARGS)格式化字符串并将其发送到某个接收者的方法。例如:
server->send_message("value1: %d, value2: %0.3f, value3: %s", 2, 3.14, "hello world");
Run Code Online (Sandbox Code Playgroud)
我知道流的概念,我也知道boost::format。但我想知道没有不必要的依赖关系的最简单的方法是什么。
这是我的想法:
使用基于流的方法- 结果将如下所示:
server->msg_out() << "value1: " << 2
<< ", value2: " << 3.14
<< ", value3: '" << "hello world" << "'";
Run Code Online (Sandbox Code Playgroud)
这对我来说看起来最合理,但它非常冗长,很难看出输出会是什么样子。特别是当您尝试实现表格输出或实际值的特殊格式时。从好的方面来说,你没有任何依赖性。
使用基于 C 的变量参数。看起来就像上面的例子,尽管它已被弃用、容易出错且不灵活,但它是众所周知的并且被大量使用。
server->send_message(boost::format(
"value1: %d, value2: %0.3f, value3: %s") % 2 % 3.14 % "hello world")); …Run Code Online (Sandbox Code Playgroud)_vscprintf在Android上不可用.也vsprintf(NULL, fmt, ap)不起作用(产生seg故障),所以似乎无法计算vsnprintf成功所需的缓冲区大小?
Android 源代码表明__android_log_print函数只是使用vsnprintf将字符串截断为1024 ...
你如何处理这种情况?
在我的C++代码中经常使用以下类型的辅助函数:
static inline std::string stringf(const char *fmt, ...)
{
std::string ret;
// Deal with varargs
va_list args;
va_start(args, fmt);
// Resize our string based on the arguments
ret.resize(vsnprintf(0, 0, fmt, args));
// End the varargs and restart because vsnprintf mucked up our args
va_end(args);
va_start(args, fmt);
// Fill the string
if(!ret.empty())
{
vsnprintf(&ret.front(), ret.size() + 1, fmt, args);
}
// End of variadic section
va_end(args);
// Return the string
return ret;
}
Run Code Online (Sandbox Code Playgroud)
它有一些上升空间:
现在,我有一些问题:
我正在使用受此答案启发的格式功能。只要我通过const char*它,一切就可以正常工作:
const char* hello = "Hello";
std::string world = "world";
string_format("%s, %s!", hello , world.c_str());
// Returns "Hello, world!"
Run Code Online (Sandbox Code Playgroud)
现在,我在所有地方都使用std :: strings,我想避免.c_str()在任何地方调用。如何修改此函数以为我调用它,并允许我仅将std :: strings传递给它?
我感兴趣(出于各种原因)格式使用sprintf将结果放在一个std::string对象中.我提出的语法最直接的方法是:
char* buf;
sprintf(buf, ...);
std::string s(buf);
Run Code Online (Sandbox Code Playgroud)
还有其他想法吗?
我有一个简单的问题,但无法在互联网上找到答案.我正在使用Windows的本地WiFi API并尝试获取接入点的MAC.
在WLAN_BSS_ENTRY类型的结构中,有一个名为dot11Bssid的字段,它基本上是一个包含6个无符号字符的数组.
我想要做的是将MAC地址放在std :: string中,如下所示:'AA:AA:AA:AA:AA:AA'.
我可以像这样打印地址:
for (k = 0; k < 6; k++)
{
wprintf(L"%02X", wBssEntry->dot11Bssid[k]);
}
Run Code Online (Sandbox Code Playgroud)
但是我无法找到将此值移动到具有上述格式的字符串的方法.
如果你想知道我为什么要在字符串中使用它,我需要帮助,我需要将它与以这种方式格式化的字符串进行比较.在此先感谢您的时间.
c++ ×8
printf ×4
string ×3
c++11 ×2
formatting ×2
stdstring ×2
android ×1
android-ndk ×1
c ×1
c++17 ×1
c++20 ×1
g++ ×1
header-files ×1
performance ×1