检查输入值的第一个字符,如果条件之一为假,请再次输入

Check entered value's first character, if one of the conditions false, ask input again

使用 C++;

我需要从用户那里获取输入,然后检查条件(见下文),如果其中一个条件为假,请再次要求用户输入(循环),仅使用 iostream header.

条件如下:

  1. 输入必须是字母(输入不能是数字、单词、符号)
  2. 输入必须是"h"或"p"或"u"字母(输入不能是其他字母和单词,如"ux"、"xu"、"uu", "hup")

我尝试了很多但都失败了

#include <iostream>

using namespace std;

int main(){

    char type;
    cout<<"enter type: ";
    cin>>type;

        while(cin.fail()==1){
        cout<<"error! invalid type. try again. \ntype:";
        cin.clear();
        cin.ignore();
        cin>>type;
    }

while(cin.fail()==0){
      switch (type) {
        case 'h':
        case 'u':
        case 'p':
                break;
            default:
                cout<<"error!invalid type. try again.\ntype: ";
                cin>>type;
        }
    }

    cout<<"valid type";

    return 0;

}

假设您的“types”是单独的,space 分隔字符最简单的方法似乎是读取一个字符串,验证它只有一个字符长,并且该字符有一个适当的值,例如:

std::string tmp;
while (std::cin >> tmp
       && (tmp.size() != 1
           || (tmp[0] != 'h' && tmp[0] != 'u' && tmp[0] != 'p'))) {
    std::cout << "ERROR: invalid type try again\n";
}
if (!std::cin) {
    std::cout << "ERROR: reached the end of the stream before reading a valid type\n";
}
else {
    char type = tmp[0];
    // now do something...
}

根据您的需要,您可能想要阅读一整行(使用 std::getline())而不是一个单词。

要解决此问题,您可以使用字符数组。例如,对于最多 100 个字符的输入,您可以像这样定义类型变量:

char type[100];

此数组将包含字符的 ASCII 代码,如果您使用转义序列,则在最后一个字母之后您的元素将是 null'[=14=]'。如果大小为 1 并且第一个字符是字母,则您的输入将是一个字母。所以声明这些简单的函数你的代码会更清晰:

bool isOneCharacter(char* str)
{
    //check if the first character exists and the second one not
    return ((str[0]!='[=11=]')&&(str[1]=='[=11=]'));
}

bool isLetter(char ch)
{
    //check if a character is between ['a'-'z'] or ['A'-'Z']
    return (((ch>='a') && (ch<='z'))|| ((ch >= 'A') && (ch <= 'Z')));
}

bool isHUP(char ch)
{
    return ((ch=='h')||(ch=='u')||(ch == 'p'));
}

知道了这些,你的主函数就容易写了:

int main() {

    char type[100]; //input
    bool isOk; //it will be true only if the input fits the conditions

    do 
    {
        isOk = false; //initial value
        cout << "Type = ";
        cin >> type; 
        //note that the first space will be treat as the end of your input
        if (isOneCharacter(type)) //if type is a single character
        {
            //type contains a simple character at this point
            char charType = type[0];
            //if the input contains a single letter that is 'h', 'u' or 'p'
            if (isLetter(charType) && (isHUP(charType)))
            {
                isOk = true;
            }
        }

        if (!isOk)
        {
            //error message for the user
            cout << "Try again!" << endl;
        }
    } while (!isOk);
}

在这种具体情况下,您绝对不需要检查输入是否为字母,因为如果它的值为 'h' 'u' 或 'p' 则自动意味着它是一个字母。如果你的输入是一个字母而不是 'h' 'u' 或 'p' 上面的程序将要求用户输入一个新的输入而不检查它是否是一个字母。但是如果你需要通过检查来解决这个问题,我已经为你写好了。