Hilfe C-Programm, kreditkarte
-
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!