检查输入值的第一个字符,如果其中一个条件为false,则再次询问输入

时间:2015-12-19 19:49:49

标签: c++ loops input char iostream

使用c ++;

我需要从用户那里获得输入,然后检查条件(见下文),如果其中一个条件为假,请再次询问用户输入(循环),仅使用iostream标题。

以下是条件:

  1. 输入必须是字母(输入不能是数字,单词,符号)
  2. 输入必须是“h”或“p”或“u”字母(输入不能是另一个字母和单词,如“ux”,“xu”,“uu”,“hup”)
  3. 我尝试了很多,但我失败了

    #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;
    
    }
    

2 个答案:

答案 0 :(得分:0)

假设你的&#34; type s&#34;是个别的,空格分隔的字符,最简单的方法似乎是读取一个字符串,验证它只是一个字符长,并且该字符具有适当的值,例如:

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())而不是一个单词。

答案 1 :(得分:0)

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

char type[100];

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

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

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);
}

在这种具体情况下,你并不一定要检查输入是否是字母,因为如果它的值是&#39; h&#39; &#39; U&#39;或者&#39; p&#39;自动意味着它的一封信。如果您的输入是一封信,但不是&#39; h&#39; &#39; U&#39;或者&#39; p&#39;上面的程序将询问用户输入新的输入而不检查它是否是一个字母。但如果您需要通过检查来解决这个问题,我已经为您编写了这个问题。