Можете ли вы создать строку аналогично std::cout?

#c

#c

Вопрос:

Следующий оператор выводит все виды выходных данных на консоль в виде одной строки текста

 std::cout << "Hi, my name is " << name_as_string << " and I am " << age_as_int << " years old, while weighing " << weight_as_double << " kilograms.";
  

Можем ли мы использовать этот же синтаксис для построения строки в строковой переменной? Как это делается?

Ответ №1:

 #include <sstream>

std::ostringstream ss;
ss << "Hi, my name is " << name_as_string;
ss << " and I am " << age_as_int << " years old, while weighing ";
ss << weight_as_double << " kilograms.";

std::string str = ss.str();
  

Вы также можете использовать std::istringstream для множественного ввода и std::stringstream как для ввода, так и для вывода.

 std::string str = "1 2 3 4 5";
std::istringstream ss(str);
int i;
while( ss >> i) {
    std::cout << i;
}
  

Комментарии:

1. Технически std::ostringstream было бы более простым.

2. Мне кажется, это позор, что вы не можете просто использовать std::string str = ss; в последней строке. Предположительно, на то есть веская причина, вы знаете, в чем она заключается?

3. @BillForster: Неявные преобразования иногда опасны и часто нежелательны.

4. @GMan: Да, я знаю, но в данном случае вся идея заключается в создании чего-то, что вы можете преобразовать в строку. Почему бы не упростить преобразование настолько, насколько это возможно?

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

Ответ №2:

stringstream выручит вас здесь;

 #include <sstream>

std::stringstream ss;

ss << stuff << to << output;

std::string s = ss.str();
  

Ответ №3:

Используйте std::ostringstream

Ответ №4:

Используя std::stringstream :

 #include <sstream>
#include <iostream>

int main()
{
  std::stringstream ss;
  ss << "Hi, my name is " << name_as_string << " and I am " << age_as_int << " years old, while weighing " << weight_as_double << " kilograms.";
  std::cout<<ss.str()<<std::endl;
}