如何验证字符串中的最后四个字符在1900到2000之间?

时间:2018-12-12 02:59:02

标签: c++

如何验证字符串的最后四位数字在1900到2100(含)范围内?我什至不需要确切的答案,但是至少要如何检查字符串中的数字。

**Python**

1 个答案:

答案 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 范围19002100

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