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
2116175

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.