没有“转到”的C用户输入限制和正确的重试

我有以下代码:

qstn:
  cout << "Input customer's lastname: ";
  getline(cin, lname);

  if (lname.find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ") != string::npos) {
      cout << "You can only input alpha here!\n";
      cin.clear();
      goto qstn;
  } else if (lname.empty()) {
      cout << "Please enter your firstname!\n";
      cin.clear();
      goto qstn;
  }

  int lnamel = lname.length();
  int strl = str.length();
  int is = 0;

  for (int i = 1; i < strl;) {
      i++;
      is++;

      if (lname[i] == lname[is] && lname[i] == ' ' || lname[0] == ' ') {
          cin.clear();
          cout << "Please input your lastname properly!\n";
          goto qstn;
      }
  }
  // next question here

我很难想到什么是正确的逻辑来避免
goto声明,自从我上大学以来我一直在使用它,但有人在这里说
根本不使用它可能会破坏我的代码.

我尝试使用do while循环,但它并不像goto那样流畅.

请帮忙!

解决方法:

使用功能:

bool getLastName(string & lname,
                 string & str)
{
    cout << "Input customer's lastname: ";
    getline(cin, lname);

    if (lname.find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ")
            != string::npos)
    {
        cout << "You can only input alpha here!\n";
        cin.clear();
        return false;
    }
    else if (lname.empty())
    {
        cout << "Please enter your firstname!\n";
        cin.clear();
        return false;
    }
    int lnamel = lname.length();
    int strl = str.length();
    int is = 0;
    for (int i = 1; i < strl;)
    {
        i++;
        is++;
        if (lname[i] == lname[is] && lname[i] == ' ' || lname[0] == ' ')
        {
            cin.clear();
            cout << "Please input your lastname properly!\n";
            return false;
        }
    }
    return true;
}

我在这里所做的就是用return false替换gotos.如果程序使其到达函数的末尾,则返回true.在while循环中调用函数:

while (!getLastName(lname, str))
{
    // do nothing
}

这不仅会破坏代码,而且会将其分解为漂亮,小巧,易于管理的部分.这称为procedural programming.

上一篇:c – 吃了EOF后重复使用std :: cin


下一篇:c – 非阻塞std :: getline,如果没有输入则退出