Почему моя строка не печатается? - PullRequest
7 голосов
/ 03 февраля 2011

У меня есть некоторый код, который в своей наименьшей законченной форме, который демонстрирует проблему (будучи добропорядочным гражданином, когда дело касается вопросов), сводится к следующему:Я ожидаю, что он выдаст

[Value was: 11]

Вместо этого я получаю просто:

[]

Почему это так?Почему я не могу вывести свою строку?Строка пуста?cout как-то сломан?Я сошел с ума ?

Ответы [ 5 ]

8 голосов
/ 03 февраля 2011

"Value was: " относится к типу const char[12]. Когда вы добавляете к нему целое число, вы фактически ссылаетесь на элемент этого массива. Чтобы увидеть эффект, измените x на 3.

Вам придется явно создать std::string. Опять же, вы не можете объединить std::string и целое число. Чтобы обойти это, вы можете написать в std::ostringstream:

#include <sstream>

std::ostringstream oss;
oss << "Value was: " << x;
std::string result = oss.str();
4 голосов
/ 03 февраля 2011

Забавно :) Вот за что мы платим за C-совместимость и отсутствие встроенного string.

Во всяком случае, я думаю, что наиболее читаемый способ сделать это будет:

std::string s = "Value was: " + boost::lexical_cast<std::string>(x);

Поскольку тип возврата lexical_cast здесь std::string, будет выбрана правая перегрузка +.

4 голосов
/ 03 февраля 2011

Нельзя добавить символьный указатель и целое число, как это (вы можете, но это не будет делать то, что вы ожидаете).

Сначала вам нужно преобразовать x в строку. Вы можете сделать это вне C-способа, используя функцию itoa для преобразования целого числа в строку:

char buf[5];
itoa(x, buf, 10);

s += buf;

Или STD-путь со стримстом:

#include <sstream>

std::ostringstream oss;
oss << s << x;
std::cout << oss.str();

Или непосредственно в строке cout:

std::cout << text << x;
2 голосов
/ 03 февраля 2011

В C / C ++ нельзя добавить целое число в массив символов с помощью оператора +, поскольку массив char распадается на указатель.Чтобы добавить int к string, используйте ostringstream:

#include <iostream>
#include <sstream>

int main (void) {  
  int x = 11;
  std::ostringstream out;
  out << "Value was: " << x;
  std::string s = out.str();
  std::cout << "[" << s << "]" << std::endl;
  return 0;
}
2 голосов
/ 03 февраля 2011

C ++ не объединяет строки с помощью оператора +. Также нет автоматического продвижения из типов данных в строку.

...