如何验证字符串的最后四位数字在1900到2100(含)范围内?我什至不需要确切的答案,但是至少要如何检查字符串中的数字。
**Python**
答案 0 :(得分:3)
目前,您检查的if (date[5] < 1 || date[5] > 2)
与您的意图不完全相同。大多数C ++(和C)编译器均采用ASCII编码其字符。因此,字符'0'
(通常)的整数值为48
,字符'1'
(通常)的整数值为49
,依此类推。
当前代码的另一个问题是递归。以下代码将无限期循环,打印输出和递归。 (即使下一个日期输入有效,它也会继续循环播放。)
while(date.length() > 9 || date.length() < 9)
{
cout << "\nInvalid entry, must be 9 characters.\n";
getDate();
}
您可以在此处简单地使用 if
语句,并记住正确处理递归。 (即,您要确保返回 new getDate()
的结果。因此,return getDate();
)
建议您在检查字符串是否在 if
语句之内之前,不要将其转换为数字 first 范围1900
到2100
。
string getDate()
{
std::string date = "01APR2021"; // read date (or hard-code it)
// perform checks
if (date.length() != 9) // you can simplify your length check
{
// error message
return getDate(); // beware of your while-loop and recursion
}
std::string lastFour(date.end() - 4, date.end()); // substring of last four characters of date
std::string::size_type noIntTrack; // tracks the stoi finishing position
int year = std::stoi(lastFour, &noIntTrack); // converts the year to an integer
if (noIntTrack != 4) // if not 4 => unsuccessful conversion
{ // e.g. maybe user entered 01APR20AA
// error handling:
// noIntTrack should be 4 to signify successful conversion of all characters
return getDate(); // recurse
}
if (!(1990 <= year && year <= 2100)) // check if year not in range
{
// handle year out of range
return getDate();
}
// other checks (e.g. month/date?)
// if (date is not good) { return getDate(); }
// date is valid:
// party
return date;
}