相关疑难解决方法(0)

如何使用 <format> 标头

在一个相关的问题(“ 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

c++ formatting g++ header-files c++20

11
推荐指数
2
解决办法
3346
查看次数

在 C++ 中格式化字符串的最佳方法

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)什么是最好的解决方案(如果可能的话)?

c++ string c++17

7
推荐指数
2
解决办法
5万
查看次数

仅带有std :: string的C ++变量参数

我正在尝试创建一个函数,该函数采用可变数量的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,并vsprintfstd::string只,避免 …

printf variadic-functions stdstring c++11

6
推荐指数
2
解决办法
1万
查看次数

C++ 中字符串格式化的首选方法?

这对我来说有点冗长:

ostrstream ss;
ss << "Selected elements: " << i << "," << j << ".";
string msg(ss.str(), (size_t)ss.pcount());
Run Code Online (Sandbox Code Playgroud)

是否有一种优雅的方法来使用简洁的单行语句(可能带有模板或宏)来格式化文本消息?

c++ string-formatting

5
推荐指数
1
解决办法
139
查看次数

提供格式化字符串作为参数的现代方法

我有一个与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 的变量参数。看起来就像上面的例子,尽管它已被弃用、容易出错且不灵活,但它是众所周知的并且被大量使用。

  • 使用Boost.Format

    server->send_message(boost::format(
                "value1: %d, value2: %0.3f, value3: %s") % 2 % 3.14 % "hello world")); …
    Run Code Online (Sandbox Code Playgroud)

c++ string string-formatting

5
推荐指数
1
解决办法
1374
查看次数

_vscprintf相当于Android?

_vscprintf在Android上不可用.也vsprintf(NULL, fmt, ap)不起作用(产生seg故障),所以似乎无法计算vsnprintf成功所需的缓冲区大小?

Android 源代码表明__android_log_print函数只是使用vsnprintf将字符串截断为1024 ...

你如何处理这种情况?

c printf android android-ndk

4
推荐指数
1
解决办法
3687
查看次数

在C++中有没有更优雅的方式将sprintf和std :: string结合起来?

在我的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)

它有一些上升空间:

  1. 字符串长度没有任意限制
  2. 字符串是就地生成的,不会被复制(如果RVO正常工作)
  3. 外面没有惊喜

现在,我有一些问题:

  1. 重新扫描varargs有点难看
  2. 事实上,std :: …

c++ string printf string-formatting c++11

4
推荐指数
2
解决办法
1508
查看次数

函数采用可变参数模板包将std :: strings转换为const char *?

我正在使用受此答案启发的格式功能。只要我通过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传递给它?

c++ formatting

4
推荐指数
1
解决办法
408
查看次数

sprintf到std :: string直接?

我感兴趣(出于各种原因)格式使用sprintf将结果放在一个std::string对象中.我提出的语法最直接的方法是:

char* buf;
sprintf(buf, ...);
std::string s(buf);
Run Code Online (Sandbox Code Playgroud)

还有其他想法吗?

c++ performance printf stdstring

3
推荐指数
1
解决办法
9044
查看次数

将十六进制值保存到C++字符串

我有一个简单的问题,但无法在互联网上找到答案.我正在使用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++

3
推荐指数
1
解决办法
5938
查看次数