2015-09-06 2 views
0

У меня есть std::vector<const char*> с именем log в классе Gui, который я пытаюсь выполнить итерацию и использовать значения в качестве аргументов для библиотечной функции. Проблема в том, что она, кажется, возвращает неверные/ошибочно типизированные данные.std :: vector :: const_iterator не указывая на нужные данные

void Gui::Message(const char *text, ...) 
{ 
    char buffer[256]; 
    va_list args; 
    va_start(args, text); 
    vsnprintf(buffer, 256, text, args); 
    va_end(args); 
    log.emplace(log.begin(), buffer); 
} 

Это форматирует строку правильно и добавляет ее в вектор. Если я вызову puts(log.front()) после I emplace буфера, он выведет правильный результат на консоль. Кроме того, если I emplace(text) вместо буфера, он отображается правильно, когда вызывается Gui::render(), но он явно не отформатирован.

void Gui::render() 
{ 
    int y = 1; 
    for(std::vector<const char*>::const_iterator iter = log.begin(); 
     iter != log.end(); iter++); 
    { 
     terminal_color("light grey"); 
     //takes x and y coordinates and a const char* and prints to the specified cell 
     terminal_printf(1, 45 + y, "%s", (*iter)); 
     y++; 
    } 
} 

Теперь, если я называю puts((*iter)) вместо функции печати терминала, он по-прежнему печатает неправильные данные, поэтому не кажется, проблема с библиотечной функцией.

Рефакторинг структуры данных для хранения сообщений является опцией, но строки должны быть должным образом отформатированы и переданы в функцию печати библиотеки.

ответ

1

Ваш буфер является временным хранилищем, действительным только до тех пор, пока функция сообщения не вернется. Вы сохраняете указатель на то, где был буфер, но его содержимое исчезнет до использования сохраненного указателя.

Если вы хотите что-то, что действует как строка, используется std::string, не злоупотребляйте const char*

0

Вы не нажимаете const char* на buffer, вы помещаете char, который стирается.

Вы используете string и облегчаете свою жизнь.

+0

Он толкает 'константный символ *' (после преобразования), проблема заключается в том, что она указывает на хранение, который будет освобождён сразу после . –

Смежные вопросы