#include #include int luhncheck(const char *number) { register int i, ii, num, parity, sum = 0; register int len_number = strlen(number); register int real_len_number = 0; for (i = 0; i < len_number; i++) { num = number[i] - 48; if (num < 0 || num > 9) continue; real_len_number++; } if (real_len_number <= 0) return 0; parity = real_len_number % 2; for (ii = 0, i = 0; i < len_number; i++) { num = number[i] - 48; if (num < 0 || num > 9) continue; if (ii % 2 == parity) { sum += num * 2; if (num * 2 > 9) sum -= 9; } else { sum += num; } ii++; } return ! (sum % 10); } #if defined(SELF) || defined(SELFTEST) || defined(SELF_LUHNCHK) #include int main(int argc, char **argv) { if (argc < 2) { printf("Usage: %s \n", argv[0]); return 1; } printf("Credit card with number '%s' is %svalid.\n", argv[1], luhnchk(argv[1]) ? "" : "not "); return 0; } #endif