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

#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
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

von devnull (8870 Punkte)
- 07.12.2014 um 18:02 Uhr

/************************************ * 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
Seite 1 von 0
1