C :: Aufgabe #60 :: Lösung #1

2 Lösungen Lösungen öffentlich
#60

IBAN Checksumme prüfen

Anfänger - C von pocki - 26.11.2014 um 12:27 Uhr
Schreibe eine Funktion, welche einen IBAN als Zeichenfolge entgegen nimmt.
Bei diese Zeichenfolge soll überprüft werden, ob die Checksumme/Prüfsumme für eine gültige IBAN stimmt.

Die unterschiedliche Schreibweisen (mit und ohne Freiraum) sowie die unterschiedlichen Längen je nach Land sind ebenfalls zu berücksichtigen.

Beispiele der Schreibweisen:
DE19 1234 1234 1234 1234 12
DE19-1234-1234-1234-1234-12
DE19123412341234123412
AT19 1234 1234 1234 1234
CH19 1234 1234 1234 1234 1
#1
vote_ok
von devnull (8870 Punkte) - 07.12.2014 um 18:02 Uhr
Quellcode ausblenden C-Code
/************************************
 * iban.c          check IBAN number
 * compile: gcc -o iban iban.c -lgmp
 ************************************/
#include <stdlib.h>
#include <ctype.h>
#include <stdio.h>
#include <gmp.h>
#include <string.h>

#define IBANLEN  34
#define IBANCLEN 66
 
#define ALPHA10(a) ((a - 55)/10 + '0')  
#define ALPHA01(a) ((a - 55)%10 + '0')  
 
// convert iban string to numeric string 
char *iban_convert(char *iban) {
	static char ibanc[IBANCLEN+1];
	char *p, *pc;
	
	p = iban+4;   // start of BAN
	pc = ibanc;
	while (*p && (p-iban) <= IBANLEN) {
		if (isalpha(*p)) {
			*pc++ = ALPHA10(*p);
			*pc++ = ALPHA01(*p);
		} else if (isdigit(*p)) {
			*pc++ = *p;
		}
		p++;
	}		
	if (*p)
		return NULL;

	p = iban;
	// Laendercode
	*pc++ = ALPHA10(*p);
	*pc++ = ALPHA01(*p++);
	*pc++ = ALPHA10(*p);
	*pc++ = ALPHA01(*p++);
	// Pruefziffer
	*pc++ = *p++;
	*pc++ = *p;
	*pc = '\0';
	return ibanc;
}

// check iban, return 0 if valid
int iban_check(char *iban) {
	mpz_t iban_mpv, iban_mpr;
	unsigned long int iban_ulr;
	char *ibanc;

	if ((ibanc = iban_convert(iban)) == NULL)
		return -1;

	// multi precision "mod 97" 
	mpz_init(iban_mpr);		
	mpz_init_set_str(iban_mpv, ibanc, 10);
	iban_ulr = 	mpz_fdiv_r_ui(iban_mpr, iban_mpv, 97L);
	mpz_clear(iban_mpv);
	mpz_clear(iban_mpr);
	return (iban_ulr != 1L);
}
 
int main(int argc, char **argv) {
	char iban[IBANLEN+1];
	char frm[6];
 
    if (argc > 1)
        strncpy(iban, argv[1], IBANLEN);
    else {
        printf("Eingabe IBAN: ");
        sprintf(frm, "%%%ds", IBANLEN);
        scanf(frm, iban);
    }
    iban[IBANLEN] = '\0';
    printf("Die IBAN '%s' ist %skorrekt.\n", iban,\
			iban_check(iban) ? "nicht ":"");
    return 0;
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben