Std::vector::const_iterator没有指向期望的数据

std::vector::const_iterator not pointing to desired data

本文关键字:期望 数据 vector const iterator Std      更新时间:2023-10-16

我在Gui类中有一个名为logstd::vector<const char*>,我试图迭代并使用这些值作为库函数的参数。问题是它似乎返回不正确/错误输入的数据。

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

这将正确格式化字符串并将其添加到vector中。如果在对缓冲区执行emplace之后调用puts(log.front()),它将向控制台输出正确的输出。另外,如果我使用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))而不是终端打印函数,它仍然打印不正确的数据,因此它似乎不是库函数的问题。

重构数据结构以存储消息是一种选择,但是字符串需要能够被正确格式化并传递给标准库的print函数。

缓冲区是临时存储,仅在Message函数返回之前有效。您正在保存指向缓冲区所在位置的指针,但在使用保存的指针之前,其内容将消失。

如果你想要一些像字符串一样的东西,使用std::string,不要滥用const char*

你不是把const char*推到buffer上,你是把char擦除。

您使用string,使您的生活更轻松。