我知道这是一个太着名的问题,但我似乎无法找到答案
我有这样的感觉:
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条件中的条件)。这是因为我猜的流,但我虽然cin.ignore(...)应该清除,代码应该工作。 希望这个解释足够了:))
提前致谢:)
答案 0 :(得分:3)
我注意到b
未在循环中定义。除非它是全局的并且所有命令类都重置它,否则它永远不会被设置回0 ...这意味着第一个"Help"
将永远是"Help"
。更糟糕的是,最终你要写过你的阵列。
由于b
几乎完全是cmd
的索引和单词计数,因此它应该在同一范围内定义。通过在填充b = 0;
的循环之前添加cmd
,可以解决这两个问题。 (但是,如果你不在循环之外使用b
,你应该在里面定义它。)
但实际上,您可能最好使用std::getline
一次读取整行std::string
,然后使用istringstream
的提取运算符(而不是{ {1}})将单个单词提取到向量中。 (get()
就是你用C做的.C ++里面有动态可调整大小的容器,因此数组中没有太大的意义。它总是太大或太小。)
观看:
char input[MAX];
请注意,没有缓冲区可以超出,并且对线路大小没有人为限制。