【问题标题】:C++ command line prompt shouldn't repeatC++ 命令行提示不应重复
【发布时间】:2018-10-10 00:46:33
【问题描述】:

我的程序从命令行获取输入,并且应该能够处理单字符和多字符命令,如下所示:

prompt> A  
A response
prompt> AB  
A response  
B response  

但是现在我的程序的行为是这样的:

prompt> AB
A response
prompt>
B response

如何构建循环来解决此问题?
现在我有:

for(;;)
  cout << prompt
  cin >> command
  // error checking
  switch(command) { ... }

【问题讨论】:

  • 不重复cout &lt;&lt; prompt 行怎么样。顺便说一句,您的示例甚至无法编译。
  • 规范在每个命令或一系列命令之前要求用户提示。是的,我只是想说明这一点
  • 您的问题(问题)完全不清楚,但我想您需要std::getline(std::cin,command); 而不是std::cin &gt;&gt; command; 并从整行解析command

标签: c++ io command-line-arguments


【解决方案1】:

如何构建循环来解决这个问题?

一种方法是:

  1. 将输入作为令牌读取。
  2. 迭代令牌的字符
  3. 按您认为合适的方式处理每个字符。

std::string token;
std::cout << prompt;
std::cin >> token;
for ( char command : token )
{
   switch(command) { ... }
}

如果您希望能够将空白字符视为命令,则有必要使用std::getline 读取一行文本并遍历该行的字符。

std::string line;
std::cout << prompt;
std::getline(std::cin, line);
for ( char command : line )
{
   switch(command) { ... }
}

【讨论】:

  • getline 在这里可能是更好的选择,以防空格可以作为命令。
  • 在这种情况下,我们可以假设没有空格,所以第一个解决方案完美运行。谢谢!
  • @AlexanderWisowaty,不客气。很高兴我能提供帮助。
【解决方案2】:

假设 command 被声明为 char 你的代码完全按照你说的做。

for(;;)
  cout << prompt // prompt user types AB
  cin >> command  // read one char A
  // error checking
  switch(command) { ... } // process it
}

现在循环返回并重新提示。

你需要

for(;;)
{
  cout << prompt
  cin >> commandString // std::string
  for(auto command : commandString) // loop over each char
  {
   switch(command) { ... }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-04
    • 2017-02-26
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2011-10-26
    相关资源
    最近更新 更多