2012-04-18 1 views
28

Я пытаюсь сделать что-то очень простое, и все же, после часа поиска и поиска я не могу найти подходящий ответ, поэтому я должен упустить что-то довольно очевидное.C++ создать строку текста и переменных

Я пытаюсь динамически создавать имена файлов для использования с ifstream. Хотя я понимаю, что для этого доступны различные методы, я решил создать std :: string и использовать stringname.c_str для преобразования в const.

Проблема в том, что мне нужно создать строку с сочетанием переменных и предопределенных текстовых значений. Я получаю ошибки компилятора, поэтому это должно быть проблемой синтаксиса.

Псевдо

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

Спасибо!

+4

если это синтаксис err или вы должны опубликовать фактический код, тогда мы можем сказать, что вам нужна синтаксическая ошибка (и почему это неправильно), и вы узнаете больше, чем если бы мы просто дали вам правильный синтаксис. – twain249

+0

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

ответ

44

Считаете ли вы использование строковых потоков?

#include <string> 
#include <sstream> 

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

Точно + std :: ostringstream будет достаточно. – doc

+0

Спасибо @eli - Это был метод, который я изначально попытался без везения, но сейчас работает! Можете ли вы объяснить, что делает ss.str()? –

+0

'ss.str()' извлекает содержимое 'stringstream'. –

2

Вы также можете использовать Sprintf:

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

Это не очень безопасно. Дополнительная сложность обеспечения безопасности, вероятно, делает его не очень хорошим выбором. –

+0

'snprintf()' будет лучшим выбором. 'snprintf (str, 1024," somtext% s sometext% s ", somevar, somevar);' – doc

+2

Это небезопасно, но * слишком * удобно сравнивать с громоздким std :: string & ostringstream. – Yury

16
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; 
+1

... Предполагая, что * type * of 'somevar' находится в списке' operator + (* type *) '. – doc

+0

@doc Да. В противном случае вам придется добавить код вокруг 'somevar', чтобы он работал.Например, если это 'int', вы можете использовать Boost :: lexical_cast, чтобы сделать его строкой. (Или, в этом случае, решение 'stringstream' может быть лучше.) –

2

Смотрите также boost::format:

#include <boost/format.hpp> 

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

В C++ 11 вы можете использовать std::to_string:

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