【问题标题】:Replacing characters in a string in C++在 C++ 中替换字符串中的字符
【发布时间】:2013-10-07 18:50:12
【问题描述】:

在我的应用程序中,我将从数据库中检索错误消息字符串。我想将数字替换为错误消息。错误消息将是一个 C 风格的字符串,如:

Message %d does not exist

Error reading from bus %d

理想情况下,我希望能够使用此语句执行 C 风格的 printf,并将我自己的数字代入其中。我知道我可以手动完成,但有没有更简单的方法可以像字符串一样使用它在普通的 printf 中?

【问题讨论】:

  • 在 libc 中使用 sprintf() 有什么问题?
  • @yan 缓冲区溢出。最好至少使用snprintf
  • 如何使用 sprintf 来做到这一点?假设我将文本读入变量 char *text="Message %d 不存在" 我可以使用它将文本打印到缓冲区,但是如何替换 %d?
  • @DavidBrown 我不是指sprintf(),我指的是s*printf() 系列函数。

标签: c++ c database string


【解决方案1】:

除了用于简单的字符串连接或将<<与数字和消息一起使用。

我能想到boost::format

int message_no=5;
std::cout << boost::format("Message %d doesn't exist") % message_no ;

【讨论】:

    【解决方案2】:

    C++的方式是使用std::stringstream:

    std::stringstream str;
    str << "Message " << messageName << " doesn't exist";
    
    std::string out = str.str();
    

    还有非常不错的仅标题提升string algorithms library:

    std::string message = "Message %s doesn't exist";
    boost::replace_first( str, "%s", "MyMessage" );
    
    // message == "Message MyMessage doesn't exist"
    

    还有boost::format,它的作用类似于 printf,但完全是类型安全的,并且支持所有用户定义的类型:

    std::string out = format( "Message %1 doesn't exist" ) % "MyMessage";
    

    【讨论】:

    • boost::format 可能是最接近我正在寻找的东西。谢谢。
    猜你喜欢
    • 2011-10-20
    • 2012-08-30
    • 2014-07-30
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2021-04-24
    相关资源
    最近更新 更多