boost split - cout 和 vector - 解释这个行为

boost split - cout and vector - explain behaviour of this

我对 c++ 和 boost 很陌生,我不明白这里到底发生了什么。

所以我正在使用 cin 从用户那里获取一些输入。然后我将该空格字符串拆分为一个向量并尝试打印该向量的第一个索引。

我的代码:

std::string cmd;
std::vector<std::string> args;

while (std::cin >> cmd) {
    boost::split(args, cmd, boost::is_any_of(" "), boost::token_compress_on);

    Console::print(args[0]);
    break;
    //reset the vector
    //std::cin.clear();
    //args.clear();
}

我的控制台打印功能只使用普通的 cout,这是它的代码:

int Console::print(std::string message, int color)
{
    HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(consoleHandle, brightGreen);
    std::cout << "myconsole :: ";
    SetConsoleTextAttribute(consoleHandle, color);
    std::cout << message << "\n";
    return 0;
}

发生了什么:

为了这个问题,输入是 "start go"。

我只想打印第一个元素。没有中断,我的程序首先打印开始,然后打印出来。我已经确定该程序执行 2 个循环并且每次都打印第一个元素,我知道这一点,因为如果我有中断,那么只会打印开始并且程序结束。首先,为什么会这样?为什么向量的第一个索引被删除然后循环生成第一个索引 "go"?

这一切是不是和stringstream/buffer什么的有关。我对这些了解不多。那是我的猜测,所以我尝试用 cin.clear() 重置缓冲区并用 args.clear() 清空向量,但仍然产生相同的结果。

其次,如果我使用下面的代码并尝试访问第二个元素 "go",我的程序就会崩溃。根据我从上面所做的尝试,我可以假设我正确地拆分了字符串。

是否发生了某种异步行为,而拆分函数尚未完成?或者?

任何帮助都会很棒。谢谢

您的问题是 std::cin >> cmd 仅读取 "start",将其送入循环(创建单个元素向量并打印唯一元素),然后循环并使用 "go".

你需要while(std::getline(std::cin, cmd)).

您还需要学习使用调试器,它会告诉您问题出在哪里。