0

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

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 属性来清除在给定时间当前驻留在缓冲区中的换行符的缓冲区,但是当我尝试编译时它给了我一堆乱码编译器错误?为什么会这样,我该如何解决?

4

3 回答 3

1

假设你包括

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

然后我没有收到任何错误。

于 2013-11-06T08:55:54.120 回答
0

getline您正在使用and的奇怪组合cin...如果您正在使用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;
}
于 2013-11-06T08:55:20.757 回答
0

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

如果您可以为命令提供参数,我建议您删除该cin >> ...部分以及cin.ignore()调用,并仅使用getlineand std::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: ";
}

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

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


或者,如果您想更通用,请使用例如 astd::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: ";
}

参见例如这些参考:

于 2013-11-06T09:02:47.387 回答