Hilfe C-Programm, kreditkarte
-
Huhu,
in diesem Code sollen einige Fehler drinne sein, komme aber grad nit wirklich weiter ... nen paar hatte ich schon rausgeholt aber naja.... seht ihr noch welche? Vielen Dank schonmal!
#include <stdio.h> #include <string.h> /* Die Kreditkarten-Prüfsumme basiert auf dem Luhn-Algorithmus. Alle Ziffern werden von rechts beginnend addiert; die Ziffern mit den geraden Indizes (beginnend bei 1 für die letzte Ziffer) werden verdoppelt. Falls die Verdopplung 9 überschreitet, wird 9 von der Ziffer abgezogen. Die Kartennummer ist gültig, wenn die Summe ein Vielfaches von 10 ergibt. Testdaten (http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm): Australian BankCard 5610591081018250 Visa 4111111111111111 Visa 4012888888881881 */ void validate(int *digits) { int i; int sum; int is_valid; for (i = 0; i < 16; i++) { int digit = digits[i] - '0'; if (i%2 = 0) { /* Ungerade Position: addieren */ sum += digit; } else { /* Gerade Position: Verdoppeln, evtl. 9 abziehen, addieren */ digit *= 2; if (digit >= 9) digit -= 9; sum += digit; } } is_valid = (sum % 10) == 0 } int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: csum <card number>\n"); return 1; } if (strlen(argv[1]) != 16) { printf("Only 16-digit card numbers are supported\n"); return 1; } if (!validate(argv[1]) { printf("Checksum error\n"); return 2; } retrun(0); }
-
Kannst du ein bisschen genauer werden, was für Fehler wir suchen sollen? Wir sind keine Hellseher. Auf den ersten Blick sehe ich sogar Rechtschreibfehler in Schlüsselwörtern sowie einen operator-! auf einen void-Wert angewandt, der Code kann so niemals übersetzt werden. Hast du den etwa für das Forum abgetippt? Bitte unbedingt Copy & Paste benutzen, sonst finden wir bloß deine Tippfehler, nicht die eigentlichen Fehler.
http://www.c-plusplus.net/forum/200753
http://www.c-plusplus.net/forum/304133
http://www.c-plusplus.net/forum/136013
-
Ich hab den Code kurz überflogen und da sind mir folgende Punkte aufgefallen (vielleicht hats noch mehr drin, habe nicht allzu genau hingeschaut):
In
if (i%2 = 0)
hats einen Fehler drin.
Wenn i % 2 gleich 0 ist, ist i dann gerade oder ungerade?
validate(..) hat keinen return type. Die Variable is_valid ist nicht sichtbar in main. Gib der Funtkion validate(..) einen bool Rückgabetyp.
Das return statement sieht etwas vermurkst aus
-
Huhu,
danke schon mal! Und es ist eigentlich eine Übung zur Fehlersuche, da waren noch deutlich mehr drinne vorher
Es sollte btw
if (i%2 == 0) sein! den hatte ich eben noch gefunden.
-
Huhu,
hab noch einige Fehlende Klammern bzw zuviele gefunden und dann mal den kompilier benutzt.
Dabei kam nurnoch eine Fehlermeldung:
csum.c:55:5: Fehler: falsche Benutzung eines Voids-Ausdruckes
Der code sieht nu wie folgt aus:#include <stdio.h> #include <string.h> /* Die Kreditkarten-Pr��fsumme basiert auf dem Luhn-Algorithmus. Alle Ziffern werden von rechts beginnend addiert; die Ziffern mit den geraden Indizes (beginnend bei 1 f��r die letzte Ziffer) werden verdoppelt. Falls die Verdopplung 9 ��berschreitet, wird 9 von der Ziffer abgezogen. Die Kartennummer ist g��ltig, wenn die Summe ein Vielfaches von 10 ergibt. Testdaten (http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm): Australian BankCard 5610591081018250 Visa 4111111111111111 Visa 4012888888881881 */ void validate(char *digits) { int i; int sum; int is_valid; for (i = 0; i < 16; i++) { int digit = digits[i] - '0'; if (i%2 == 0) { /* Ungerade Position: addieren */ sum += digit; } else { /* Gerade Position: Verdoppeln, evtl. 9 abziehen, addieren */ digit *= 2; if (digit >= 9) digit -= 9; sum += digit; } } is_valid = (sum % 10) == 0; } int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: csum <card number>\n"); return 1; } if (strlen(argv[1]) != 16) { printf("Only 16-digit card numbers are supported\n"); return 1; } if (!validate(argv[1])) { printf("Checksum error\n"); return 2; } return(0); }
-
icarus2 schrieb:
validate(..) hat keinen return type. Die Variable is_valid ist nicht sichtbar in main. Gib der Funtkion validate(..) einen bool Rückgabetyp.
int geht auch.
-
Habe jetzt das void in ein int geändert und am ende der validate funktion einfach ein:
return is_valid;
drinne, dürfte das somit nu richtig sein?
-
Hört sich richtig an.
Was sagt der Compiler und der Testlauf?
-
der compiler ging durch, aber das programm funktioerniert nicht wirklich
Die Testdaten gehen ganze zeit als falsch, also checksum error durch ...
-
Dann gib die Daten mal testweise verkehrt herum ein.
Ich glaube da ist ein Fehler in der Berechnung gerade/ungerade.
Der Code fängt ganz links an (Index 0, Stelle 16) -> Also sollte es gerade sein -> verdoppeln.
Im Code steht aber nur einfach.
-
Auch andersrum klappt des nicht
-
sum ist auch nicht initialisiert:
int sum = 0;
Sonst mal Kontrollausgaben einbauen (in jedem Schleifendurchlauf i, digit und sum ausgeben) oder Debugger nehmen.
-
wie ein vorposter schon sagte ist die berechnung falschrum
if (i%2 == 0) { /* Ungerade Position: addieren */ sum += digit; }
x modulo 2 ist eben dann null wenn x eine gerade zahl ist
außerdem ist auch hier ein fehler:
if (digit >= 9)
es muss >9 heißen oder >=10
-
Danke an alle
Funktioniert nu!