【问题标题】:(c++)Input needs to be a single character, but it accepts multiple characters and checks the first letter(c++)输入需要是单个字符,但它接受多个字符并检查第一个字母
【发布时间】:2018-12-06 01:52:37
【问题描述】:

我创建的程序有问题。 它应该接受用户的输入并检查它是“P”还是“M”。 问题是我只希望它在您输入“P”或“M”时工作,因为现在它接受您输入的任何内容为“M”,只要它以“M”开头(例如,如果您输入“莫尔斯”它会接受它作为“M”)。 我不是程序员,对 c++ 了解不多,我只是为了好玩。举例说明:

int main(){
  std::cout << "Enter 'M' or 'P'\n";
  char slction;
Inputrror:
  std::cin >> slction;
  switch (slction) {
  case 'M':
    goto Morse;
    break;
  case 'm':
    goto Morse;
    break;
  case 'P':
    goto Text;
    break;
  case 'p':
    goto Text;
    break;
  default:
    std::cout << "Please only enter 'M' or 'P'\n;
    goto Inputrror;
    break;
  }
Morse:
  std::cout << "Morse\n;"
  return 1;
Text:
  std::cout << "Text\n;"
  return 1;
}

编辑:我尝试将输入读取为建议的字符串,现在它可以正常工作。正确版本:

int main() {
  std::cout << "Enter 'M' or 'P'\n";
  std::string slction;

Inputrror:
  std::cin >> slction;
  if (slction == "M" || slction == 'm') {
    goto Morse;
  }
  else if (slction == "P" || slction == 'p') {
    goto Text;
  }
  else {
    std::cout << "Please only enter 'P' or 'M'\n";
    goto Inputrror;
  }

Morse:
  std::cout << "Morse\n";
  return 1;

Text:
  std::cout << "Text\n";
  return 1;

}

【问题讨论】:

  • 欢迎来到 Stack Overflow!不幸的是,您的问题仅包含要求:它没有显示您自己为解决此问题所做的任何努力。请edit您的问题显示your attempt far,您将更有可能收到有助于您进步的答案。以minimal reproducible example 向我们展示您的工作、您期望的结果和您得到的结果,我们将帮助您解决问题。重新阅读How to Ask可能会有所帮助。
  • 请出示您的代码,我们不知道您的意思,例如“...它重定向到第一个开关盒”。没有代码
  • 请注意,仍然使用更正的版本,程序将接受像M garbage 这样的输入。如果您不希望出现这种情况,您可以考虑改用std::getline

标签: c++ input


【解决方案1】:

在我回答之前有一条评论:

而不是

case 'M':
  goto Morse;
  break;
case 'm':
  goto Morse;
  break;

你可以使用

case 'M':
case 'm':
  goto Morse;
  break;

break 停止该块,因此只要您不使用它,您就可以一个接一个地嵌套。您甚至可以执行以下操作:

case 'M':
  cout << "CAPITALIZED";
case 'm':
  goto Morse;
  break;

现在,对于您的问题:您正在阅读char,这意味着它只会占用您输入的第一个字母。如果您也希望能够阅读单词,请改用字符串:

string slction;
cin >> slction;

PD:记得将case 'M' 和其他选项的引号更改为双引号(用于字符串)

PD2:你不能对字符串使用 switch,所以你必须使用 if/else 块

【讨论】:

  • 感谢您的提示,我不知道我可以在 switch 中做到这一点。
  • 哦,顺便说一句,你不能在字符串中使用 switch,我的错(有一段时间没有使用 c++),所以你将不得不使用“if/else”块
  • 是的,我知道,谢谢。如果您查看我帖子中的编辑,不幸的是,我在将输入读取为字符串时也遇到了一些困难。
  • 它应该与大写版本“P”和“M”一起使用。问题是您使用的是slction == "M" || 'm',这意味着“slction 是否等于 M”?当程序回答不是时,下一个问题是“m?”,显然这没有多大意义。尝试将其更改为:slction == "M" || slction == "m"
  • 好吧,我一直在想这个错误,在像你说的那样纠正它之后,它完美无瑕,谢谢。
【解决方案2】:

根据第一个答案中所说的,您还可以使用#include &lt;cctype&gt; toupper() 函数来删除多余的案例。以及使用 if 语句验证您的输入。

示例验证函数:

char isValid(char &selection){

    std::cin >> selection;
    selection = toupper(selection); // ctype.h for toupper changes all to uppercase characters

    //checks to see if more than 1 character is inputed
    if (std::cin.get() != '\n'){
            std::cin.ignore(256, '\n'); //ignores 256 chars until newline('\n')
            std::cin.clear(); // clears the input
            selection = '\0'; // sets selection to null
    }
    return selection;
}

DEMO

【讨论】:

    猜你喜欢
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多