Fehler in Code suchen

damdidu

Grünschnabel
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!
Code:
#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);
}
 
In Zeile 26:

Code:
if (i%2 = 0)

sollte wohl

Code:
if (i%2 == 0)

lauten.

Die Funktion validate() liefert ein void als Rückgabe, du verwendest sie aber, als hätte sie kein void. Außerdem ist die Variable is_valid in validate() nur lokal verfügbar, das Ergebnis ist also in main() eben nicht verfügbar. Du solltest die Funktion zu int umschreiben und den Wert von is_valid returnen.

Hab dann aufgehört, könnte also noch weitere Fehler geben.

EDIT: Noch was ist mir aufgefallen: der Parameter von validate ist ein Pointer auf int, innerhalb der Funktion wird der Parameter aber wie ein Char-Pointer verwendet und die Funktion wird auch mit einem Char-Pointer aufgerufen. Du solltest also aus

Code:
int *digits

Code:
char *digits

machen. Besser noch, du machst const char *, denn innerhalb der Funktion wird der Inhalt von digits nicht verändert.

Ist das eigentlich eine Hausaufgabe wo du auf Fehlersuche gehen sollst oder ist das ein tatsächlich eingesetztes "produktives" Programm?
 
Zuletzt bearbeitet:
Huhu,
danke schon mal! Es ist eine Art Hausaufgabe, da waren noch viel mehr Fehler drinne bevor ich es hier gepostet hatte :/
 
Hi

kompilier das doch einmal, dann werden die meisten Fehler
(als Fehler oder Warnungen) schon gezeigt.

Was zB. noch ist: Auf Zeile 40 fehlt zumindest ein ;
und Zeile 60 sollte return statt retrun lauten.

PS: Nachträglich Willkommen bei tutorials.de :)
 
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:

Code:
#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);
}
 
Saftmeister hat die Lösung doch schon geschrieben:
"return is_valid;" am ende der Funktion, und den Typ anpassen (void->int).
 
Wie ich schon schrieb, hat die validate()-Funktion als Rückgabe void. Das ist an der Stelle sicher unerwünscht. Mach aus dem void ein int und gib dann mit return is_valid zurück.
 
Ja, habe es auf int geändert und der Fehler is weg. Allerdings hab ich des return is_valid nicht mit drinne und es lässt sich dennoch kompilieren, wozu is das dann genau?
 
Wenn sich das ohne Warnungen kompilieren lässt hast du falsch kompiliert :p
Jedenfalls wird das Programm nicht wie erwartet funktionieren.

Was ein return ist...
Kapitel 9 von http://openbook.galileocomputing.de/c_von_a_bis_z/
behandelt Funktionen. Da steht das auch dabei.
(das Lesen der Kapitel 1-8 und der Weiteren ist sicher auch nicht verkehrt)

(und nein, man muss sich das Buch nicht kaufen.
Da Inhaltverzeichnis besteht aus Links zum Anklicken.)
 
Zurück