【问题标题】:why is my compiler complaining when i try to clear the cin buffer为什么当我尝试清除 cin 缓冲区时我的编译器会抱怨
【发布时间】:2013-11-06 08:44:55
【问题描述】:

我正在编写一个程序,我试图实现以下代码:

int main(){

string inputcmd;


while (getline(cin, inputcmd)){
    cout << "TYPE A COMMAND" << endl;   
    cin >> inputcmd;

    cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n'); 

    if (inputcmd == "make"){
        cout << "MAKING NEW PROJECT" << endl;
        get_project(cin);
    }

    else if (inputcmd == "retrieve"){
        cout << "RETRIEVING YOUR PROJECT" << endl;
    }
}

return 0;
}

我正在尝试使用 cin.ignore 属性来清除在给定时间当前驻留在缓冲区中的换行符的缓冲区,但是当我尝试编译时,它给了我一堆乱码编译器错误?为什么会这样,我该如何解决?

【问题讨论】:

  • 当您发布有关构建错误的问题时,请始终包含完整且未经编辑的错误日志。无论它对您来说似乎是胡言乱语,还是很多,它都可以帮助我们了解正在发生的事情。
  • 也发布错误..
  • 顺便说一句,您确实包含&lt;limits&gt;,这是std::numeric_limits所需要的吗? (关于发布代码的另一个提示,请创建一个包含问题的SSCCE,然后完整发布。)
  • 除了错误消息本身之外,您还缺少您似乎使用过的包含和使用指令。请提供SSCCE
  • 我包含了限制,现在它可以编译了。但是现在由于某种原因它卡在了第一个主 while 循环中,程序运行并询问 TYPE A COMMAND 但这就是它所要求的全部内容,有时您必须按几次换行符才能再次要求它。我该如何解决这个问题?

标签: c++ buffer cin


【解决方案1】:

假设你包括了

#include <string>
#include <iostream>
using namespace std;

那么我没有收到任何错误。

【讨论】:

    【解决方案2】:

    您需要按一个额外的换行符,因为您阅读了输入两次。第一次使用getline,第二次使用cin &gt;&gt; ...

    如果您可以为命令提供参数,我建议您删除 cin &gt;&gt; ... 部分以及 cin.ignore() 调用,并仅使用 getlinestd::istringstream

    std::cout << "Enter command: ";
    while (std::getline(std::cin, line))
    {
        std::istringstream iss(line);
    
        // Get the command
        std::string command;
        iss >> command;
    
        if (command == "make")
        {
            ...
        }
        ...
    
        std::cout << "Enter command: ";
    }
    

    这样,您也可以轻松获取命令的空格分隔参数。

    是的,您有两次打印提示的代码,但在我看来,这是一个较小且可以忽略不计的问题。


    或者,如果您想更通用,请使用例如std::vector 来存储命令和参数,并执行类似的操作

    std::cout << "Enter command: ";
    while (std::getline(cin, line))
    {
        std::istringstream iss(line);
    
        std::vector<std::string> args;
    
        // Get the command and all arguments, and put them into the `args` vector
        std::copy(std::istream_iterator<std::string>(iss),
                  std::istream_iterator<std::string>(),
                  std::back_inserter(args));
    
        if (args[0] == "make")
        {
            ...
        }
        ...
    
        std::cout << "Enter command: ";
    }
    

    参见例如这些参考:

    【讨论】:

      【解决方案3】:

      您正在使用getlinecin 的奇怪组合...如果您正在使用getline,则根本不必调用cin.ignore。不要像以前那样混合使用两者,否则您会得到令人困惑的结果。

      这个例子可以如你所愿地运行:

      #include <string>
      #include <iostream>
      
      using namespace std;
      
      int main(){
        string inputcmd;
        bool running = true;
        while (running){
          cout << "TYPE A COMMAND" << endl;
          getline(cin, inputcmd);
          if (inputcmd.substr(0, inputcmd.find(" ")) == "make"){
            if(inputcmd.find(" ")!=string::npos){
              inputcmd = inputcmd.substr(inputcmd.find(" ")+1);
              cout << "MAKING NEW PROJECT: " << inputcmd << endl;
              //get_project(cin);
            }else{
              cout << "make: not enough arguments" << endl;
            }
          }else if (inputcmd == "retrieve"){
            cout << "RETRIEVING YOUR PROJECT" << endl;
          }else if(inputcmd == ""){
            running = false;
          }
        }
        return 0;
      }
      

      【讨论】:

      • 您可能希望在 getline 调用周围设置一个条件。如果用户按下EOF组合键或者出现错误怎么办?
      猜你喜欢
      • 2013-05-13
      • 2020-01-14
      • 2019-06-16
      • 2012-05-21
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多