C++ create string of text and variables

C++StringVariablesStd

C++ Problem Overview


I'm trying to do something very simple and yet, after an hour of so of searching a I can't find a suitable answer so I must be missing something fairly obvious.

I'm trying to dynamically create filenames for use with ifstream. Whilst I understand various methods are available of doing this, I have settled on creating a std::string, and the using stringname.c_str to convert to const.

The problem is however that I need to create the string with a mix of variables and predefined text values. I'm getting compiler errors, so this must be a syntax issue.

Pseudo

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

Thanks!

C++ Solutions


Solution 1 - C++

Have you considered using stringstreams?

#include <string>
#include <sstream>

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

Solution 2 - C++

In C++11 you can use std::to_string:

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

Solution 3 - C++

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

This doesn't work because the additions are performed left-to-right and "sometext" (the first one) is just a const char *. It has no operator+ to call. The simplest fix is this:

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

Now, the first parameter in the left-to-right list of + operations is a std::string, which has an operator+(const char *). That operator produces a string, which makes the rest of the chain work.

You can also make all the operations be on var, which is a std::string and so has all the necessary operators:

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

Solution 4 - C++

The new way to do with c++20 is using format.

#include <format>

auto var = std::format("sometext {} sometext {}", somevar, somevar);

Solution 5 - C++

You can also use sprintf:

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

Solution 6 - C++

See also boost::format:

#include <boost/format.hpp>

std::string var = (boost::format("somtext %s sometext %s") % somevar % somevar).str();

Solution 7 - C++

You could have something like:

#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();
}

And then use it like:

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

The Compose macro is just to avoid using the curly brackets. You could also use a variadic function, but eh

Solution 8 - C++

Since c++14 you can use the std::string operator""s from std::string_literals

#include <string>
using namespace std::string_literals;
std::string var = "sometext"s + somevar + "sometext"s + somevar;

The compiler will add a std::string in place of the literal, and as such you can use the "+" operator with it.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJack FarrowView Question on Stackoverflow
Solution 1 - C++mgiuffridaView Answer on Stackoverflow
Solution 2 - C++David RinckView Answer on Stackoverflow
Solution 3 - C++David SchwartzView Answer on Stackoverflow
Solution 4 - C++alkinoView Answer on Stackoverflow
Solution 5 - C++QuantumBlackView Answer on Stackoverflow
Solution 6 - C++YuryView Answer on Stackoverflow
Solution 7 - C++William BanksView Answer on Stackoverflow
Solution 8 - C++AutexView Answer on Stackoverflow