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

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
#2
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;
}


Kommentare:

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

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