1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

c übergebene variablen

    • Frage
  • thery
  • 13. Januar 2008 um 17:24
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • thery
    Punkte
    35
    Beiträge
    5
    • 13. Januar 2008 um 17:24
    • #1

    hallo!

    folgendes:

    mein programm sieht so aus:

    int main(int argc, char *argv[]) {
    ..
    }

    beim aufrufen des programms sollen 4 integer variablen übergeben werden. wie kann ich diese variablen mit hilfe von strtol aus argv herausholen?

    wäre super, wenn mir jemand helfen könnte! :)

    lg,thery

  • sloth
    Punkte
    1.717
    Beiträge
    314
    • 13. Januar 2008 um 18:16
    • #2

    Hey, ich nehme mal an, du brauchst das, für das TGS Aufgabenblatt 11 :P
    Im Zusatzblatt zur letzten Hausübung waren da sehr nützliche Hinweise dazu.

    Grundsätzlich wird in argc die Anzahl der Worte, die du beim Programmaufruf eingibst, gespeichert.

    Folgende Möglichkeiten:
    ./prog1 (argc=1)
    ./prog1 prm1 (argc=2)
    ./prog1 prm1 prm2 (argc=3)
    usw...

    Damit kannst du also mal ganz einfach überprüfen, ob die Anzahl der übergebenen Parameter stimmt.

    argv ist ein char array. In ihm werden nun oben genannte Worte gespeichert. An der Stelle argv[0] hast du den Programmnamen, an der Stelle argv[1] den ersten Parameter usw.

    Um jetzt aber die als char vorhandenen Parameter für unser Beispiel benutzen zu können, musst du diese erst in "brauchbare" Datentypen umwandeln. Hier kommt strtol ins Spiel. Diese Funktion wandelt dir strings (also char arrays) in long oder int Variablen um. Näheres dazu findest du in den man-Pages zu strtol. Praktisch dabei ist, dass du bei strtol auch einen end-Pointer benutzen kannst, der an das Ende des Strings zeigt und mithilfe dessen du überprüfen kannst, ob überhaupt eine Zahl und nicht ein anderes Zeichen übergeben wurde.


    Ich hoffe, die Informationen helfen dir soweit mal ein wenig :O

  • Martinez
    Punkte
    465
    Beiträge
    81
    • 13. Januar 2008 um 18:51
    • #3

    kannst auch getopt() verwenden

  • sauzachn
    Punkte
    3.101
    Beiträge
    606
    • 13. Januar 2008 um 23:11
    • #4
    Zitat von Martinez

    kannst auch getopt() verwenden


    Das wäre ziemlich dumm, schließlich will er ja keine Optionen auslesen, sondern vier Argumente (vermutlich auch noch genau in der Reihenfolge, wie man sie eintippt).

  • Kampi
    Punkte
    7.828
    Beiträge
    1.468
    • 14. Januar 2008 um 12:07
    • #5
    Code
    int i,ar[argc-1];
    
    
    for (i = 1; i < argc; i++)
    {
       ar[i-1] = strtol(argv[i],NULL,10);
    }
  • sloth
    Punkte
    1.717
    Beiträge
    314
    • 14. Januar 2008 um 13:20
    • #6
    Zitat von Kampi
    Code
    int i,ar[argc-1];
    
    
    for (i = 1; i < argc; i++)
    {
       ar[i-1] = strtol(argv[i],NULL,10);
    }


    Besser noch statt dem 0-Pointer einen einen error-Pointer zu machen für Fehlermeldungen, falls "falsche" Parameter übergeben wurden :)

  • Kampi
    Punkte
    7.828
    Beiträge
    1.468
    • 14. Januar 2008 um 14:10
    • #7
    Zitat von sloth

    Besser noch statt dem 0-Pointer einen einen error-Pointer zu machen für Fehlermeldungen, falls "falsche" Parameter übergeben wurden :)

    a geh, wir sind ja hier nicht bei sysprog :P
    wollte "thery" nur in die richtige richtung bringen, fuer solche feinheiten hat man ja dann ohnehin "man strtol" mit einem ausfuehrlichen beispiel.

  • sloth
    Punkte
    1.717
    Beiträge
    314
    • 14. Januar 2008 um 17:03
    • #8
    Zitat von Kampi

    a geh, wir sind ja hier nicht bei sysprog :P
    [...]


    Na eh nicht, aber es geht schon in die Richtung :p

  • Martinez
    Punkte
    465
    Beiträge
    81
    • 14. Januar 2008 um 21:13
    • #9
    Zitat von sauzachn

    Das wäre ziemlich dumm, schließlich will er ja keine Optionen auslesen, sondern vier Argumente (vermutlich auch noch genau in der Reihenfolge, wie man sie eintippt).

    stimmt.

  • jeuneS2
    Punkte
    1.227
    Beiträge
    238
    • 14. Januar 2008 um 21:30
    • #10
    Zitat von Kampi

    a geh, wir sind ja hier nicht bei sysprog :P

    Nicht C89-konformen Code zu schreiben ist immer ein Grund, zumindest im Fegefeuer zu landen.

  • thery
    Punkte
    35
    Beiträge
    5
    • 15. Januar 2008 um 10:28
    • #11

    danke! habt mir alle sehr geholfen!

  • Kampi
    Punkte
    7.828
    Beiträge
    1.468
    • 15. Januar 2008 um 11:52
    • #12
    Zitat von jeuneS2

    Nicht C89-konformen Code zu schreiben ist immer ein Grund, zumindest im Fegefeuer zu landen.

    na servas, da gehts ja ganz genau her :shinner:. so besser?

    C
    #include <stdio.h>
    #include <limits.h>
    #include <stdlib.h>
    #include <errno.h>
    
    
    int main(int argc, char **argv)
    {
            int i;
            char *endptr;
            long *ar;
    
    
            ar = (long *) malloc ( (argc - 1) * sizeof(long));
    
    
            if (ar == NULL)
            {
                    fprintf(stderr, "Cannot allocate memory\n");
                    exit(EXIT_FAILURE);
            }
    
    
            for (i = 0; i < argc-1; i++)
            {
                    errno = 0;
    
    
                    ar[i] = strtol(argv[i+1],&endptr,10);
    
    
                    if ((errno == ERANGE && (ar[i] == LONG_MAX || ar[i] == LONG_MIN))
                               || (errno != 0 && ar[i] == 0))
                    {
                            free(ar);
                            perror("strtol");
                            exit(EXIT_FAILURE);
                    }
    
    
                    if (endptr == argv[i+1])
                    {
                            free(ar);
                            fprintf(stderr, "Not a digit: %s\n",endptr);
                            exit(EXIT_FAILURE);
                    }
    
    
                    if (*endptr != '\0')
                    {
                            printf("Further characters after number: %s\n", endptr);
                    }
    
            }
    
    
            for (i = 0; i < argc-1; i++)
            {
                    printf("%ld\n",ar[i]);
            }
    
    
            /* free the whales, free the mallocs */
            free(ar);
    
    
    return 0;
    }
    Alles anzeigen
  • hal
    Punkte
    11.122
    Beiträge
    2.208
    • 15. Januar 2008 um 11:53
    • #13

    Und jetzt bitte nochmal in K&R C :)

  • sauzachn
    Punkte
    3.101
    Beiträge
    606
    • 15. Januar 2008 um 15:47
    • #14
    Zitat von jeuneS2

    (...) C (...) Code zu schreiben ist immer ein Grund, zumindest im Fegefeuer zu landen.


    :D

    Nuntium inputatum nimis brevest. Quaeso porlonga nuntium tuum ad characteres tres minimum.

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum