How to resolve the algorithm IBAN step by step in the C programming language

Published on 7 June 2024 03:52 AM
#C

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:

  1. Header Includes:

    • The code includes necessary header files for string manipulation, standard input/output, memory allocation, and type conversions.
  2. 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.
  3. String Trimming:

    • The strip() function removes all blank spaces from the input string s and updates its length. It does this by iterating through the characters, skipping blanks, and compacting the non-blank characters.
  4. 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.
  5. 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.
    • If the modulo 97 result is 1, the function returns 1, indicating a valid IBAN. Otherwise, it returns 0.
  6. 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.

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