Первое, что нужно сделать, это распечатать прочитанные вами данные;ты пробовал это?С 64-байтовыми целыми числами вы можете обрабатывать 16-значные номера карт, хотя формат ввода должен быть довольно жестким.Кроме того, вы можете прочитать число в виде строки (это означает, что ваша программа может допускать пунктуацию; я считаю очень утомительным, что веб-сайты не позволяют вводить пробелы или тире, где цифры сгруппированы на вашей реальной кредитной карте).При отладке проблем убедитесь, что входные данные, с которыми фактически работает программа, соответствуют ожидаемым.
Если вы используете 32-битную компиляцию, у вас есть проблемы!
Когда ваш код скомпилирован в 64-битном режиме, образец номера кредитной карты идентифицируется как действительный.
С вашим кодом, скомпилированным в 32-битный режим, образец номера кредитной карты определяется как недействительный.(Там есть комментарий выше sizeof(long) == 4
на вашем компьютере с вашим компилятором. Либо вы компилируете в 32-битном режиме, либо компилируете в 64-битном режиме на 64-битной платформе Windows. См .: Чторазмер бита long
в 64-битной Windows? )
Когда я использовал сценарий Perl, написанный десять и более лет назад, образец CCN определяется какдействительный.
Когда я распечатал значение, считанное scanf()
в 32-битном режиме (модифицированная версия вашей программы), я получил:
$ ./ccn <<< 4388576018410707
Enter credit card number Invalid card number -0000000089805613
$
Используется особая bash
функция для подачи строки (числа) в качестве стандартного ввода в программу.
Уроки, которые нужно убрать
Знайте, что ваш компьютер может обрабатывать с помощью чисел.
Проверьте возвращаемое значение из scanf()
.
Однако,даже это не поможет вам с переполнением.Лучше прочитать строку текста в строку, а затем использовать strtol()
или родственника для проверки преобразования.С осторожностью вы можете обнаружить переполнения и недополнения, а также недопустимые значения и т. Д. И вы можете сообщить, что пользователь ввел обратно им, в то время как при неудачном преобразовании чисел (или фиктивном преобразовании чисел) вы не можете сообщить, что увидела программа..
Распечатайте введенные данные.Если вы увидели отрицательное число в выводе при вводе положительного числа, вы бы сразу узнали, почему возникают проблемы.
Если бы это была моя программа, это была бы обработка командной строкиаргументы вместо запроса ввода.
Пример Perl:
$ perl -MBRPS -e 'my($x, $y) = validate_account("4388-5760-1841-0708"); print "$x : $y\n";'
: check digit on account number is incorrect
$ perl -MBRPS -e 'my($x, $y) = validate_account("4388-5760-1841-0707"); print "$x : $y\n";'
4388576018410707 : ok
$ perl -MBRPS -e 'my($x, $y) = validate_account("4388576018410707"); print "$x : $y\n";'
4388576018410707 : ok
$ perl -MBRPS -e 'my($x, $y) = validate_account("4388 5760 1841 0707"); print "$x : $y\n";'
4388576018410707 : ok
$ perl -MBRPS -e 'my($x, $y) = validate_account("4388 57601841 0707"); print "$x : $y\n";'
: invalid punctuation pattern
$
Различает формат представления, удобный для пользователя и допускающий пробелы илитире для разделения групп цифр и внутреннего операционного формата - строки цифр, которую могут обрабатывать компьютеры.Люди должны , а не печатать 16-значные числа без знаков препинания;это совершенно нецивилизованно (при этом каждый сайт, с которым я сталкивался, настаивает на отсутствии знаков препинания).Вы можете написать функцию достаточно легко для форматирования 16-значного числа с перерывами.
Вышеприведенная функция не предназначена для представления данных пользователю - она действительно определяет, в чем проблема, но программист долженрешить, как обрабатывать ошибки.