【问题标题】:C++ create string of text and variablesC++ 创建文本和变量的字符串
【发布时间】:2012-04-18 22:51:26
【问题描述】:

我正在尝试做一些非常简单的事情,但是,经过一个小时的搜索,我找不到合适的答案,所以我一定错过了一些相当明显的东西。

我正在尝试动态创建用于 ifstream 的文件名。虽然我知道有多种方法可以做到这一点,但我决定创建一个 std::string,并使用 stringname.c_str 转换为 const。

然而,问题是我需要使用混合变量和预定义文本值来创建字符串。我遇到了编译器错误,所以这一定是语法问题。

std::string var = "sometext" + somevar + "sometext" + somevar;

谢谢!

【问题讨论】:

  • 如果是语法错误,您应该发布实际代码,然后我们可以告诉您语法错误是什么(以及为什么它是错误的),并且您会比我们只给您正确的语法学到更多.
  • std::string var = std::string("sometext") + somevar + "sometext" + somevar;

标签: c++ string variables std


【解决方案1】:

您考虑过使用字符串流吗?

#include <string>
#include <sstream>

std::ostringstream oss;
oss << "sometext" << somevar << "sometext" << somevar;
std::string var = oss.str();

【讨论】:

  • Exactly + std::ostringstream 就足够了。
  • 谢谢@eli - 这是我最初尝试的方法,没有任何运气,但现在正在工作!你能解释一下 ss.str() 到底在做什么吗?
  • ss.str() 正在提取stringstream 的内容。
【解决方案2】:

在 C++11 中你可以使用std::to_string:

std::string var = "sometext" + std::to_string(somevar) + "sometext" + std::to_string(somevar);  

【讨论】:

    【解决方案3】:
    std::string var = "sometext" + somevar + "sometext" + somevar;
    

    这不起作用,因为添加是从左到右执行的,而"sometext"(第一个)只是一个const char *。它没有可调用的operator+。最简单的解决方法是:

    std::string var = std::string("sometext") + somevar + "sometext" + somevar;
    

    现在,+ 操作的从左到右列表中的第一个参数是std::string,它有一个operator+(const char *)。该运算符生成一个字符串,使链的其余部分工作。

    您还可以使所有操作都在var 上,这是一个std::string,所有必要的运算符也是如此:

    var = "sometext";
    var += somevar;
    var += "sometext";
    var += somevar;
    

    【讨论】:

    • ...假设somevartypeoperator +(*type*) 列表中。
    • @doc 是的。否则,您必须在somevar 周围添加一些代码才能使其正常工作。例如,如果它是int,您可以使用 Boost::lexical_cast 使其成为字符串。 (或者,在这种情况下,stringstream 解决方案可能会更好。)
    【解决方案4】:

    使用 c++20 的新方法是使用 format

    #include <format>
    
    auto var = std::format("sometext {} sometext {}", somevar, somevar);
    

    【讨论】:

      【解决方案5】:

      你也可以使用 sprintf:

      char str[1024];
      sprintf(str, "somtext %s sometext %s", somevar, somevar);
      

      【讨论】:

      • 这不是很安全。使其安全的额外复杂性可能使其不是一个很好的选择。
      • snprintf() 会是更好的选择。 snprintf(str, 1024, "somtext %s sometext %s", somevar, somevar);
      • 这并不安全,但与庞大的 std::string 和 ostringstream 相比,方便了。
      【解决方案6】:

      另见boost::format

      #include <boost/format.hpp>
      
      std::string var = (boost::format("somtext %s sometext %s") % somevar % somevar).str();
      

      【讨论】:

        【解决方案7】:

        你可以有类似的东西:

        #define Compose(...) ComposeFn({ __VA_ARGS__ })
        
        std::string ComposeFn(std::initializer_list<std::string> strList) {
            std::ostringstream ss;
            for(std::string str : strList) {
                ss << str;
            }
            return ss.str();
        }
        

        然后像这样使用它:

        int errcode = 404;
        std::cout << Compose("[ERROR]: (", errcode, ") doesn't exist") << std::endl;
        

        Compose 宏只是为了避免使用大括号。您也可以使用可变参数函数,但是 eh

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-09-02
          • 2021-09-12
          • 1970-01-01
          • 2016-10-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多