整数值不被接受

时间:2019-10-16 08:37:09

标签: c++

我正在用C ++做作业,我需要验证ID,但我不明白为什么如果不能在其中读取或使用此值。

我有一个由用户传递的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]内部”

5 个答案:

答案 0 :(得分:4)

 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的问题,这将导致您期望的评估顺序不同。因此,添加一些括号,例如:

注意:前2行中仅需要一行,请参见注释

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' )
   )

答案 1 :(得分:3)

第一个字符的索引为0;最后一个具有索引- (void) traitCollectionDidChange:(UITraitCollection *)previousTraitCollection { if (@available(iOS 12.0, *)) { if (previousTraitCollection.userInterfaceStyle != UIUserInterfaceStyleUnspecified && self.traitCollection.userInterfaceStyle != previousTraitCollection.userInterfaceStyle) { for (CALayer *caLayer in _myCsLayers) { [caLayer setNeedsDisplay]; } } } }
就像数组一样。
根据标准,访问size()-1可能是越界且未定义,或者给您零。

此外,您的病情还存在一个伪命问题:dni[dni.size()]等同于a || b && c || d

如果您使用a || (b && c) || dfront而不是建立索引,则可以编写几乎完全自己的条件描述,并且可以利用标准库来避免优先级问题:

back

(请注意,您需要首先检查大小以确保字符串不为空。)

答案 2 :(得分:2)

要访问第一个字符,可以使用dni.front()dni[0],最后一个字符是dni.back()dni[dni.length() - 1]dni[dni.size() - 1]。那是因为第一个索引为0,因此最后一个索引为length-1。

此外,您还应该在if中使用括号。 if(a || b && c || d)实际上将评估为if(a || (b && c) || d)

答案 3 :(得分:0)

索引从0开始,因此,如果要索引字符串的最后一个字符,则必须将其长度索引为-1。

例如,让字符串S =“ hello!” S [0] ='h' S的大小为6,但是最高索引为S[size-1] ='!' 要修复代码,必须将dni [dni.size()]更改为dni [dni-size()-1]。

答案 4 :(得分:0)

非常感谢大家,在您的帮助下,我昨天可以完成练习清单。我还将问老师是否可以使用将整个字符串都转换为小写的方法,这样可以减少很多冗余。

//Función que valida un DNI que es pasado por parametro. Retorna un booleano
bool testeDNI(string dni){   
    bool check = false; 
    //El primer carácter tiene índice 0; el último tiene un tamaño de índice 
    //() - 1. Al igual que con los arrays.
    if(dni[0] == 'Y' || dni[dni.size()-1] == 'y' && dni[0] == 'K' || 
dni[dni.size()-1] == 'k' && dni.size()-1 == 7) {  
        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;
 }