How to resolve the algorithm IBAN step by step in the C programming language
How to resolve the algorithm IBAN step by step in the C programming language
Table of Contents
Problem Statement
The International Bank Account Number (IBAN) is an internationally agreed means of identifying bank accounts across national borders with a reduced risk of propagating transcription errors. The IBAN consists of up to 34 alphanumeric characters:
The check digits enable a sanity check of the bank account number to confirm its integrity even before submitting a transaction.
Validate the following fictitious IBAN: GB82 WEST 1234 5698 7654 32
Details of the algorithm can be found on the Wikipedia page.
Let's start with the solution:
Step by Step solution about How to resolve the algorithm IBAN step by step in the C programming language
This C code validates International Bank Account Numbers (IBANs) according to the ISO 13616-1 standard. Here's how it works:
-
Header Includes:
- The code includes necessary header files for string manipulation, standard input/output, memory allocation, and type conversions.
-
Country Code Validation:
- The
valid_cc()
function validates the country code (the first two characters of the IBAN) against a hardcoded list of valid country codes and their corresponding IBAN lengths. - If the country code is valid and the IBAN length matches the expected length, the function returns 1. Otherwise, it returns 0.
- The
-
String Trimming:
- The
strip()
function removes all blank spaces from the input strings
and updates its length. It does this by iterating through the characters, skipping blanks, and compacting the non-blank characters.
- The
-
Mod 97 Calculation:
- The
mod97()
function calculates the modulo 97 value of a large number represented as a string. - It divides the string into 7-character segments, calculates the modulo 97 of each segment, and combines the results to obtain the final modulo 97 value.
- The
-
IBAN Validation:
- The
valid_iban()
function performs the main IBAN validation:- It removes spaces from the IBAN using
strip()
. - It verifies that the IBAN consists of only upper alphanumeric characters.
- It validates the country code using
valid_cc()
. - It rotates the first four characters to the end of the string to align with the ISO 13616-1 standard.
- It allocates memory for a transformed IBAN string where characters A-Z are converted to their numeric equivalents.
- Finally, it calculates the modulo 97 of the transformed IBAN.
- It removes spaces from the IBAN using
- If the modulo 97 result is 1, the function returns 1, indicating a valid IBAN. Otherwise, it returns 0.
- The
-
Main Function:
- The
main()
function reads IBANs from the command line arguments and prints whether each IBAN is valid or not. - It uses the
valid_iban()
function to validate each IBAN.
- The
Source code in the c programming language
#include <alloca.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define V(cc, exp) if (!strncmp(iban, cc, 2)) return len == exp
/* Validate country code against expected length. */
int valid_cc(const char *iban, int len)
{
V("AL", 28); V("AD", 24); V("AT", 20); V("AZ", 28); V("BE", 16); V("BH", 22); V("BA", 20); V("BR", 29);
V("BG", 22); V("CR", 21); V("HR", 21); V("CY", 28); V("CZ", 24); V("DK", 18); V("DO", 28); V("EE", 20);
V("FO", 18); V("FI", 18); V("FR", 27); V("GE", 22); V("DE", 22); V("GI", 23); V("GR", 27); V("GL", 18);
V("GT", 28); V("HU", 28); V("IS", 26); V("IE", 22); V("IL", 23); V("IT", 27); V("KZ", 20); V("KW", 30);
V("LV", 21); V("LB", 28); V("LI", 21); V("LT", 20); V("LU", 20); V("MK", 19); V("MT", 31); V("MR", 27);
V("MU", 30); V("MC", 27); V("MD", 24); V("ME", 22); V("NL", 18); V("NO", 15); V("PK", 24); V("PS", 29);
V("PL", 28); V("PT", 25); V("RO", 24); V("SM", 27); V("SA", 24); V("RS", 22); V("SK", 24); V("SI", 19);
V("ES", 24); V("SE", 24); V("CH", 21); V("TN", 24); V("TR", 26); V("AE", 23); V("GB", 22); V("VG", 24);
return 0;
}
/* Remove blanks from s in-place, return its new length. */
int strip(char *s)
{
int i = -1, m = 0;
while(s[++i]) {
s[i - m] = s[i];
m += s[i] <= 32;
}
s[i - m] = 0;
return i - m;
}
/* Calculate the mod 97 of an arbitrarily large number (as a string). */
int mod97(const char *s, int len)
{
int i, j, parts = len / 7;
char rem[10] = "00";
for (i = 1; i <= parts + (len % 7 != 0); ++i) {
strncpy(rem + 2, s + (i - 1) * 7, 7);
j = atoi(rem) % 97;
rem[0] = j / 10 + '0';
rem[1] = j % 10 + '0';
}
return atoi(rem) % 97;
}
int valid_iban(char *iban)
{
int i, j, l = 0, sz = strip(iban);
char *rot, *trans;
/* Ensure upper alphanumeric input and count letters. */
for (i = 0; i < sz; ++i) {
if (!isdigit(iban[i]) && !isupper(iban[i]))
return 0;
l += !!isupper(iban[i]);
}
if (!valid_cc(iban, sz))
return 0;
/* Move the first four characters to the end. */
rot = alloca(sz);
strcpy(rot, iban + 4);
strncpy(rot + sz - 4, iban, 4);
/* Allocate space for the transformed IBAN. */
trans = alloca(sz + l + 1);
trans[sz + l] = 0;
/* Convert A to 10, B to 11, etc. */
for (i = j = 0; i < sz; ++i, ++j) {
if (isdigit(rot[i]))
trans[j] = rot[i];
else {
trans[j] = (rot[i] - 55) / 10 + '0';
trans[++j] = (rot[i] - 55) % 10 + '0';
}
}
return mod97(trans, sz + l) == 1;
}
int main(int _, char **argv)
{
while (--_, *++argv)
printf("%s is %svalid.\n", *argv, valid_iban(*argv) ? "" : "in");
return 0;
}
You may also check:How to resolve the algorithm Horner's rule for polynomial evaluation step by step in the Visual FoxPro programming language
You may also check:How to resolve the algorithm Idoneal numbers step by step in the ALGOL 68 programming language
You may also check:How to resolve the algorithm Conditional structures step by step in the M2000 Interpreter programming language
You may also check:How to resolve the algorithm Continued fraction/Arithmetic/Construct from rational number step by step in the Rust programming language
You may also check:How to resolve the algorithm Greatest subsequential sum step by step in the Clojure programming language