我正在用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]内部”
答案 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) || d
和front
而不是建立索引,则可以编写几乎完全自己的条件描述,并且可以利用标准库来避免优先级问题:>
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;
}