Нужна помощь в чтении символа из строки

0

Моя программа должна попросить пользователя ввести номер своей кредитной карты, а затем отобразить, являются ли номера действительными или недействительными, и если они действительны, отобразите тип карты. У меня возникли проблемы с попыткой прочитать первые 2 символа в строке cardNumber, чтобы узнать, является ли тип карты визой, mastercard, american express или Discover (4 для визы, 5 для mastercard, 37 для american express, 6 для обнаружить)

#include <iostream>
#include <string>

using namespace std;

int main()
{  
    string cardNumber; //this will carry the number given by the user.
    int sum(0), sumOfDoubleEven(0), sumOfOdd(0), evenDigit(0), oddDigit(0);

    cout << "This program is the Credit Card Number Validator." << endl;
    cout << "This program will check the validity status of your card number" << endl;

    //Main loop
    do
    {
        cout << endl << "Please provide a number to validate or type 'n' to quit ";
        cin >> cardNumber; //gets cardNumber from user
        if(cardNumber.length()>=13 && cardNumber.length()>=16)
        {
            if (cardNumber == "n") break; //exits loop on user request

            //this for loop repeats once for each digit of the cardNumber.
            //digitPosition decrements by one on each pass from last position to first position
            for (int digitPosition=cardNumber.length(); digitPosition>0; digitPosition--)
            {
                if (digitPosition%2 == 0)
                {   //executes the following code if digitPosition is even
                    oddDigit=(int)cardNumber[digitPosition-1]-'0';
                    sumOfOdd=sumOfOdd+oddDigit;
                } else {   //executes the following code if digitPosition is odd.
                    evenDigit=((int)cardNumber[digitPosition-1]-'0')*2;
                    evenDigit=evenDigit%10+evenDigit/10;
                    sumOfDoubleEven=sumOfDoubleEven + evenDigit;
                }
            }

            sum=sumOfOdd+sumOfDoubleEven; //sums the result
            cout << endl <<"The number "<<cardNumber<<" you provided is ";
            if (sum%10==0) //executes if sum is divisible by 10
                cout << "valid" << endl;
            else //executes if sum is not divisible by 10
                cout << "invalid" << endl;
            if(cardNumber.at(0)==4) {
                cout<<"Your Card type is VISA"<<endl;
            } else {
                cout<<"Sorry, you've entered a card number not in the range of 13-16 digits" <<endl;
            } 

        }
    }while (cardNumber != "n");

    return 0;
}
  • 5
    Совет профессионала: вам будет легче отлаживать код, если вы правильно отформатируете его.
  • 2
    Относительно условия cardNumber.length()>=13 && cardNumber.length()>=16 . Если длина равна или больше 16, то она также определенно равна или больше 13.
Показать ещё 2 комментария
Теги:

3 ответа

1
Лучший ответ

В коде есть некоторые нечетные части, но проблема в том, что вы проверяете первую цифру на число, а ваша цифра хранится в строке. Поэтому тест должен быть, if (cardNumber.at(0) == '4')...

1

Одна из ваших проблем состоит в том, что вы получаете первый символ (в позиции 0) и сравниваете его с int. Значение символа, а целое число - это значение, которое имеет символ в текущей кодировке. Например, в кодировке ASCII (которая является наиболее распространенной) символ '4' имеет значение 52.

Поэтому, почему сопоставление cardNumber.at(0)==4 будет выполнено, поскольку 4 не равно '4'.

1
if (cardNumber[0] == '4') {
  // VISA
} else if (cardNumber[0] == '5') {
  // mastercard
} else if (cardNumber[0] == '6') {
  // discover
} else if (cardNumber[0] == '3' && cardNumber[1] == '7') {
  // American Express
} else {
  // Invalid card type
}

Кстати, условие проверки длины номера вашей карточки не то, что вы ожидаете, это должно быть

if (cardNumber.length() >= 13 && cardNumber.length() <= 16) {...}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню