清除输入流

时间:2013-06-03 18:57:58

标签: c++ input stream

我知道这是一个太着名的问题,但我似乎无法找到答案

我有这样的感觉:

 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(...)应该清除,代码应该工作。 希望这个解释足够了:))

提前致谢:)

1 个答案:

答案 0 :(得分:3)

我注意到b未在循环中定义。除非它是全局的并且所有命令类都重置它,否则它永远不会被设置回0 ...这意味着第一个"Help"将永远是"Help"。更糟糕的是,最终你要写过你的阵列。

由于b几乎完全是cmd的索引和单词计数,因此它应该在同一范围内定义。通过在填充b = 0;的循环之前添加cmd,可以解决这两个问题。 (但是,如果你不在循环之外使用b,你应该在里面定义它。)

但实际上,您可能最好使用std::getline一次读取整行std::string,然后使用istringstream的提取运算符(而不是{ {1}})将单个单词提取到向量中。 (get()就是你用C做的.C ++里面有动态可调整大小的容器,因此数组中没有太大的意义。它总是太大或太小。)

观看:

char input[MAX];

请注意,没有缓冲区可以超出,并且对线路大小没有人为限制。