gpt4 book ai didi

c++ - 清除输入流

转载 作者:行者123 更新时间:2023-11-28 00:44:39 25 4
gpt4 key购买 nike

我知道这个问题太有名了,但我似乎找不到答案

我有这样的事情:

 while (true) {

std::cout << "\nCommand> ";
std::cin.get(input, MAX, '\n');

std::string cmdtemp = input;

std::string token;
std::istringstream issc(cmdtemp);

std::string cmd[MAX];
while ( getline(issc, token, ' ') )
{
cmd[b] = token;
b++;
}


if (cmd[0] == "help") {
Help cmd(cmd);
std::cin.ignore(100, '\n') ;

}
else if (cmd[0] == "modify")
Command* cmd = new Modify;
std::cin.ignore(100, '\n') ;
else if (cmd[0] == "convert")
Command* cmd = new Convert;
std::cin.ignore(100, '\n') ;
else if (cmd[0] == "show")
Command* cmd = new Show;
std::cin.ignore(100, '\n') ;
else if (cmd[0] == "getrates")
Command* cmd = new Getrates;
std::cin.ignore(100, '\n') ;
else {
std::cout << "Wrong command. Type help for Help.";
std::cin.ignore(100, '\n') ;
}

在第二次输入后,这变成了无限循环(虽然在第二次输入后流应该被清除,我说的对吗?),另外,例如,如果我输入“help”两次,第一次有效,但第二次一个没有

我该怎么做才能根据需要多次正确获取用户输入?

编辑:当用户输入其中一个命令时(如果还有...),将创建一个对象并运行构造函数。在“帮助”的情况下,构造函数显示带有解释的命令列表。就我而言,这只有效一次。当我输入“help”时,构造函数可以工作,但是当我再次输入“help”时,它会显示无限多的“错误命令”(我的 if else 中的其他条件)。我猜那是因为流,但我认为 cin.ignore(...) 应该清除并且代码应该可以工作。希望这个解释足够:)

提前致谢:)

最佳答案

我注意到 b 没有在循环中定义。除非它是全局的并且所有命令类都将其重置,否则它永远不会设置回 0...这意味着第一个 "Help" 将始终是 "Help" .更糟糕的是,最终您将写入数组。

因为 b 几乎完全是 cmd 的索引和单词计数,所以它可能应该在相同的范围内定义。这两个问题都可以通过在填充 cmd 的循环之前添加 b = 0; 来解决。 (不过,如果您不在循环外使用 b,那么您实际上应该在循环内定义它。)

但实际上,您最好使用 std::getline 一次读取整行作为 std::string,然后使用 istringstream 的提取运算符(而不是 get())将单个单词提取到 vector 中。 (char input[MAX]; 是您在 C 中所做的。C++ 内置了可动态调整大小的容器,因此数组中没有太多意义。它总是太大或太小。 )

观看:

while (true) {
std::cout << "Command>> " << std::flush;
std::string line;
std::getline(std::cin, line);

std::istringstream tokenizer (line);
std::vector<std::string> cmd;

// this basically just does `tokenizer >>` and sticks the string into cmd
// til the stream runs out.
typedef std::istream_iterator<std::string> words;
std::copy(words(tokenizer), words(), std::back_inserter(cmd));

if (cmd.empty()) continue;

// do stuff with `cmd`, which is a vector of words. For example:
if (cmd[0] == "quit") break;
for (std::string word : cmd) {
std::cout << word << '\n';
}
}

请注意,没有缓冲区溢出,也没有对行大小的人为限制。

关于c++ - 清除输入流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16903873/

25 4 0
文章推荐: html - 简单的 5 星,但想要响应
文章推荐: javascript - 如何确定 JSON 对象是否有子项
文章推荐: html - 使用 元素在 pdf 预览中显示的元素在 Chrome 中不是交互式的