2013-12-14 2 views
1

человека просят ввести номер своей кредитной карты, он должен иметь 16 цифр, после каждых 4 цифр он имеет пробел или -.Как проверить эту строку на C++?

У меня есть код, чтобы проверить, есть ли пробелы или дефис, а также проверка того, вводит ли это письмо вместо этого.

Проблема с этим кодом является то, что: Это говорит вне диапазона, когда я вхожу письмо, и он также говорит, что запись является правильной, когда я вошел меньше, чем то, что я установить длину быть. Любые идеи, в которых я ошибаюсь?

#include<iomanip> 
#include <iostream> 
#include<conio.h> 
using namespace std; 
int main() { 
    string creditcardnum; 
    bool validcreditcardnum; 

    do{ 
     validcreditcardnum=true; 
     cout << "Enter your credit card number\t Enter 4 numbers followed by a space or -\n\t\t"; 
     cin >> creditcardnum; 
     if(validcreditcardnum==false){ 
     cout<<"Your credit card number is invalid\n\t\t"; 
     } 
     if (creditcardnum.length()!=19){ 
     validcreditcardnum==false; 
     } 
     for(unsigned short a= 0,b=5, c=10, d=15; 
           a<=3,b<=8,c<=13,d<=18; 
           a++, b++, c++, d++){ 
     if(!isdigit(creditcardnum.at(a))&& 
       !isdigit(creditcardnum.at(b))&& 
       !isdigit(creditcardnum.at(c))&& 
       !isdigit(creditcardnum.at(d)) 
       ) 
      validcreditcardnum==false; 
      } 
      if(
       creditcardnum.at (4) !=' '||'-'&& 
       creditcardnum.at (9) !=' '||'-'&& 
       creditcardnum.at (14)!=' '||'-'){ 
      validcreditcardnum==false; 

      } 
      while(validcreditcardnum==false); 
      if(validcreditcardnum=true) 
       cout << "Credit card number is correct"; 
      return 0; 
    } 
+0

Yous также должно смотреть вверх Луны проверить для проверки номеров кредитных карт: https: //en.wikipedia .org/wiki/Luhn_algorithm – ldrumm

+0

Я бы сказал, что лучший способ сделать такую ​​проверку - использовать ['std :: regex'] (http://en.cppreference.com/w/cpp/regex), [' boost :: regex'] (http://www.boost.org/doc/libs/1_55_0/libs/regex/doc/html/index.html), если вы не можете использовать [tag: C++ 11 ]. –

+1

Это 'if' выглядит странно:' if (creditcardnum.at (4)! = '' || '-' && creditcardnum.at (9)! = '' || '-' && creditcardnum.at (14)! = '' || '-') ' – Jigsore

ответ

0

У вашего исходного кода был ряд других проблем.

Я изменил ваш код, чтобы заставить его делать то, что вы хотите. Это не изящно, но должно работать. Меня устраивает.

int main() 
{ 
string sCreditcardnum; 
char szCreditCardNum[100]; 
memset(szCreditCardNum, 0, sizeof szCreditCardNum); 
bool validcreditcardnum = true; 

do { 
    if(validcreditcardnum == false) { 
     cout << "The credit card number provided is invalid\n\n"; 
     validcreditcardnum = true; 
    } 

    cout << "Enter your credit card number\t Enter 4 numbers followed by a space or -\n\t\t"; 
    cin.getline(szCreditCardNum, 30); 
    sCreditcardnum = szCreditCardNum; 
    if (sCreditcardnum.length() != 19) 
     validcreditcardnum = false; 

    for(unsigned short a=0, b=5, c=10, d=15; 
     a<=3,b<=8,c<=13,d<=18; 
     a++, b++, c++, d++) 
    { 
     if(!isdigit(sCreditcardnum.at(a)) || 
      !isdigit(sCreditcardnum.at(b)) || 
      !isdigit(sCreditcardnum.at(c)) || 
      !isdigit(sCreditcardnum.at(d))) 
     { 
      validcreditcardnum = false; 
      break; 
     } 
    } 

    if((sCreditcardnum.at (4) != ' ' && sCreditcardnum.at (4) != '-') || 
     (sCreditcardnum.at (9) != ' ' && sCreditcardnum.at (9) != '-') || 
     sCreditcardnum.at (14) != ' ' && sCreditcardnum.at (14) != '-') 
    { 
     validcreditcardnum = false; 
    } 
} 
while(validcreditcardnum == false); 
if(validcreditcardnum == true) 
    cout << "Credit card number is correct"; 
return 0; 

} 
+0

Это хорошо, мало вопросов, что делает memset и почему программисты используют char 100, я думал, что char предназначен только для отдельных букв. – user3102359

+0

memset используется для инициализации памяти. Неинициализированный блок памяти может содержать мусор. При работе с буферами символов особенно важно инициализировать их, поскольку существует множество строковых функций, которые полагаются на «\ 0» в качестве разделителя. Что касается того, почему я использовал 100 буфера символов, я просто выбрал произвольное число, большее 20, чтобы заставить вашу программу работать. Нет ничего особенного в 100, только должно быть больше размера строки, которую вы хотите прочитать, чтобы ваша программа не разбивалась. – driftwood

+0

char - это 8-разрядный тип, который может хранить отдельные символы. char [] - это массив типа char, который может хранить строки. Оба типа являются встроенными частями языка C/C++. Напротив, «std :: string» не является встроенным типом C++, а является типом класса, который является частью библиотеки STL (Standard Template Library). – driftwood

2

Это выражение компилируется, но это неверно:

creditcardnum.at (4) !=' '|| '-' && ... 

Выражение выше всегда true, поскольку логический оператор ИЛИ || лечит все ненулевые значения как true.

Вы можете переписать выражение следующим образом:

creditcardnum.at (4) !=' ' && creditcardnum.at (4) !='-' && ... 

Кроме того, вы используете оператор запятой, где это не требуется:

for(unsigned short a= 0,b=5, c=10, d=15; 
          a<=3,b<=8,c<=13,d<=18; // <<== Here 
          a++, b++, c++, d++) 

достаточно выписать чек на любую из четыре переменные, потому что все они увеличиваются в одной и той же точке. Рассмотрим переписывание этого цикла с одним индексом и добавьте к нему «смещение» по ходу (или используйте вложенный цикл для смещений).

+0

Все теперь работает, ему тоже не хватало getline для пробелов. Без этого дополнительного оператора запятой, о котором вы упомянули, он не будет компилироваться. Остается одна проблема. Почему строка, указывающая из диапазон при вводе текста – user3102359

+0

@ user3102359 Какой текст вы вводите? (используйте обратные одинарные кавычки '' ', чтобы разграничить текст так, чтобы он оставался таким, как указано). – dasblinkenlight

+0

Twoproblems :(, если я ввожу буквы, он говорит вне диапазона. Если я ввожу 4 буквы и все числа, он говорит о правильной записи – user3102359

0

Подумайте, как разделить эту проблему на более простые подзадачи. Один из очевидных - проверить, начинается ли объект std::string с четырьмя цифрами. Другой - проверить, начинается ли объект std::string с пробелом или тире. Напишите эти две функции и используйте их для проверки номера кредитной карты. Если он начинается с четырех цифр, удалите четыре цифры; затем проверьте, начинается ли это пробел или тире, и если это произойдет, удалите первый символ. Повторяйте до конца.

0

Предлагаю рассматривать номер кредитной карты как 4 числа, а не как строку символов или набор символов.

Функции ввода C++ будут считывать символы, создавая число, до тех пор, пока не будет найден нечисловой символ. Это означает, что он остановится, когда он столкнется с пробелом или тире или дефисом между группами чисел.

Чтобы убедиться, что номер группы 4 цифры в длину, проверить диапазон:

if ((group_number > 999) && (group_number < 10000)) 
{ 
    // group number has 4 digits 
} 

Чтение номер кредитной карты может быть столь же простым, как:

int group1; 
int group2; 
int group3; 
int group4; 
cin >> group1 >> group2 >> group3 >> group4; 
if (group1 < 0) group1 *= -1; // Turn into a positive number 
if (group2 < 0) group2 *= -1; 
if (group3 < 0) group3 *= -1; 
if (group4 < 0) group4 *= -1; 
+0

Это умный подход, спасибо. – user3102359

0

На дне, ваш тест правильного знака validcreditcardnum действителен неверно.

if(validcreditcardnum=true) 

Должно быть, если (validcreditcardnum == true). В противном случае вы не получите выходные сообщения «Номер кредитной карты правильный».

+0

Просто попробовал, что он все равно всегда возвращает true, если Например, 1234-wrer-1231-abcd – user3102359

+0

Я просто разместил измененную версию вашего кода, которая работает для меня. Пожалуйста, проверьте это. – driftwood

0

Вы могли бы попробовать что-то вроде этого ...

Если длина не равна 19 BOOL ложна

цикл считать до 19 или менее 20 , если доберется до 4 9 или 14-е положения добавление 1 к отсчету , если позиция по количеству не равной цифре, то BOOL равна ложной близко к петле

для цикла подсчетом U р до 19, но в группах по пяти если positon графа не равно тому, что вам требуется Ей ложные близко к петле

Смежные вопросы