C :: Aufgabe #60

2 Lösungen Lösungen öffentlich

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

Lösungen:

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;
}
vote_ok
von Jordan (210 Punkte) - 13.03.2015 um 14:21 Uhr
Quellcode ausblenden C-Code
// 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;
}


2115839

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.