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
2115681

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.