C :: Aufgabe #60
2 Lösungen

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
Lösungen:

/************************************ * 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; }

// IBAN prüfsumme.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "string.h" #include "stdlib.h" #include "stdint.h" #include "math.h" char *deletespace(char iban[]) { //char iban_ohne_Füllzeichen[50]=""; char* iban_ohne_Füllzeichen = (char*)malloc(sizeof(char)*50); //leerzeichen löschen int j = 0; for(int i = 0; i<=strlen(iban); i++) { if(iban[i] != ' ' && iban[i] != '-') { iban_ohne_Füllzeichen[j] = iban[i]; j++; } if(iban[i] == ' ' && iban[i] == '-') { i++; iban_ohne_Füllzeichen[j] = iban[i]; j++; } } return iban_ohne_Füllzeichen; } char *p_summe(char *iban_ohne_Füllzeichen) { //char number[50]=""; char* number = (char*)malloc(sizeof(char)*50); *number = NULL; //ersten vier chars nach hinten setzen strcpy(number, &iban_ohne_Füllzeichen[4]); int size = strlen(number); for(int i = 0; i<=2; i++) { int z = iban_ohne_Füllzeichen[i]-55; //zeichen im ascii 55 abziehen bedeutet a = 10, b = 11 usw. char a[3]; itoa(z,a,10); //umwandlung in char strcat(number,a); //der Zeichenkette anfügen } number[strlen(number)-2] = '0'; number[strlen(number)-1] = '0'; return number; } char *v_summe(char *iban_ohne_Füllzeichen) { //char number[50]=""; char* number = (char*)malloc(sizeof(char)*50); *number = NULL; //ersten vier chars nach hinten setzen strcpy(number, &iban_ohne_Füllzeichen[4]); int size = strlen(number); for(int i = 0; i<=3; i++) { int z = 0; if(i == 0 || i == 1) { z = iban_ohne_Füllzeichen[i]-55; //zeichen im ascii 55 abziehen bedeutet a = 10, b = 11 usw. } else { z = iban_ohne_Füllzeichen[i]-48; } char a[3]; itoa(z,a,10); //umwandlung in char strcat(number,a); //der Zeichenkette anfügen } return number; } int modulo(char number[], int div) { const int teil_length = 6; int string_length= strlen(number); int cuts = (string_length / teil_length) + 1; int mo_div = div; int teil_cut; int rest = 0; if(string_length < 6) { char temp[10] = ""; rest = atoi(number) % mo_div; } for(int i = 0; i<cuts; i++) { if(i <cuts-1) { rest = rest*pow(10.0,teil_length); } char temp[10] = ""; strncpy(temp,&number[i*6],6); teil_cut = rest + atoi(temp); rest = teil_cut % mo_div; } return rest; } void validierung_pruefen(char iban[]) { char *v_number = v_summe(deletespace(iban)); int rest = modulo(v_number,97); if(rest == 1) { printf("Die validierung ist OK\n"); } else { printf("Die validierung ist nicht inordnung!!!!\n"); } } void pruefsummenCheck(char iban[]) { char *p_number = p_summe(deletespace(iban)); int rest = modulo(p_number,97); int pruefSumme = 98 -rest; char p_zeichen[2] =""; p_zeichen[0] = iban[2]; p_zeichen[1] = iban[3]; int PSUMME = atoi(p_zeichen); if(pruefSumme == PSUMME) { printf("Die Pruefsumme stimmt ueberein\nDie Iban ist correct\n\n\n"); } else { printf("Die Pruefsumme stimmt nicht ueberein\nDie Iban ist fehlerhaft\n\n\n"); } } int main() { char iban[50]= "DE68 2105 0170 0012 3456 78"; printf("iban: %s\n",iban); validierung_pruefen(iban); pruefsummenCheck(iban); char iban2[50]= "DE19 1234 1234 1234 1234 12"; printf("iban: %s\n",iban2); validierung_pruefen(iban2); pruefsummenCheck(iban2); getchar(); return 0; }