我正在用C ++进行作业,我需要验证ID,但是我不明白为什么if不能读取或使用此值。

我有一个由用户传递的ID值(字符串),我需要检查它是否以'Y'或'y'开头并以'K'或'k'结尾,并且还有8个字符。

我已经尝试过dni [dni.size()],dni [sizeof(dni)],dni [aux]

//Función que valida un DNI que es pasado por parametro. Retorna un booleano
bool testeDNI(string dni){

    bool check = false;
    int aux = dni.size();
    cout<< "Valor DNI: " <<aux<<endl;

    if(dni[0] == 'Y' || dni[0] == 'y' && dni[dni.size()] == 'K' || dni[dni.size()] == 'k' ) {
        std::cout << "***************************************"<< endl;
        std::cout << "*            DNI VALIDO               *"<< endl;
        std::cout << "***************************************"<< endl;
        check = true;

    }else{
        std::cout << "***************************************"<< endl;
        std::cout << "*          DNI NO VALIDO              *"<< endl;
        std::cout << "***************************************"<< endl;
    }
    //Retorna el valor de check
    return check;
 }


我做这项工作的唯一方法是使用数字。 “在dni内部[7]”

最佳答案

 if(dni[dni.size()] == 'Y' || dni[dni.size()] == 'y' && dni[dni.size()] == 'K' || dni[dni.size()] == 'k' )


dni.size()是字符串“后面”的字符!如果要检查第一个字符,只需写dni[0],最后一个字符在dni[dni.size()-1]

就像评论中提到的那样,您必须谈论有关operator precedenc的问题,它会导致您所期望的评估顺序不同。因此,添加一些括号,例如:

注意:仅需要前两行之一,请参阅注释

if(
   ( dni.size() ) && // check for empty string to prevent UB in following comparisons OR!!!
   ( dni.size() == 8 ) && // if you already have the need to check for a given length requirement
   ( dni[0]            == 'Y' || dni[0]            == 'y' ) &&
   ( dni[dni.size()-1] == 'K' || dni[dni.size()-1] == 'k' )
   )

关于c++ - 整数值不被接受,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58409095/

10-10 21:56