1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

C - Kommandozeilenparameter auf Datentyp prüfen

Discussion in 'Programmieren' started by sbob10, Nov 10, 2014.

Thread Status:
Not open for further replies.
  1. sbob10

    sbob10 Kbyte

    Hallo,

    ich würde gerne in meinem c-programm ein Kommandozeilenparameter auf den richtigen Datentyp, in meinem Falle short, prüfen. Ich komme jedoch nicht drauf wie das gehen soll. Der code sollte so einfach wie möglich sein und sich im Bereich der <stdio.h>-Bibliothek befinden. Ich dachte mir folgendenes: main(short x) {..}; Doch wie überprüft man dann den eingegebenen parameter x, ob er wirklich short ist oder nicht ?

    MFG
     
  2. kazhar

    kazhar Viertel Gigabyte

    hmm...

    soweit ich c im kopf hab, kann man main keine definierbaren datentypen verpassen, sondern man kriegt immer nur eine liste von strings:

    int main( int argc, const char* argv[] )

    diese strings musst du zu fuß z.b. in short "übersetzen".
     
  3. sbob10

    sbob10 Kbyte

    Und wie würdest du es "übersetzen", ich brauche im endeffekt eine if-funktion, die eine fehlermeldung herausgibt, falls der parameter beispielsweise nur aus buchstaben besteht, was ja kein short ist.

    ich habe beispielsweise if(argv[1]=short){} probiert, aber das geht nicht.
     
  4. VB-Coder

    VB-Coder Megabyte

    Vorweg... C ist nicht so mein Thema, aber:

    ich würde das Problem wie folgt angehen:

    SHORT umfasst Ganzzahlen im Bereich -32768 bis 32767. Demzufolge würde ich prüfen:

    ist x nummerisch (also eine Zahl) UND ist x =< 32767 UND ist x > -32768

    Wenn die 3 Bedingungen erfüllt sind, dann ist x logischer Weise SHORT.


    also in etwa so:

    Vielleicht bringt dich das weiter
     
  5. root

    root Megabyte

    Damit würde ein String mit einem Integer verglichen werden, was nicht funktioniert. Der Parameter muss zuerst in einen Integer umgewandelt werden, z.B. mit atoi:
    Code:
    int param = atoi(argv[1]);
    if (isNumber(argv[1]) && param <= 32767 && param > -32768){...}
     
  6. kazhar

    kazhar Viertel Gigabyte

    eine derartige prüfung ist alles andere als trivial.
    das codefragment von root leistet übrigens auch nicht das gewünschte.

    erkennt man sehr einfach, wenn man mal versuchsweise z.b. 9223372036854775808 als parameter angibt. die zahl lässt sich nämlich nicht in ein "int" quetschen und die umwandlung liefert sehr wahrscheinlich 0

    edit: mein binary ist mittlerweile etwas ein gerostet; nicht -1 sondern 0
     
    Last edited: Nov 16, 2014
  7. root

    root Megabyte

    atoi ist tatsächlich nicht gut geeignet, wenn es um das Erkennen von fehlerhaften Eingaben geht.
    Hier wird -1 zurückgeliefert, was allerdings laut POSIX nicht festgelegt ist: http://pubs.opengroup.org/onlinepubs/9699919799/functions/atoi.html

    Hier mein zweiter Versuch, diesmal mit strtol:
    Code:
    #include <stdio.h>
    #include <errno.h>
    
    int main(int argc, char *argv[]) {
            long param;
            char *endptr;
    
            if (argc != 2) {
                    fprintf(stderr, "Es wird genau ein Parameter erwartet.\n");
                    return 1;
            }
    
            errno = 0;
            param = strtol(argv[1], &endptr, 10);
            if (*endptr != '\0' || argv[1][0] == '\0' || errno == ERANGE || errno == EINVAL || param > 32767 || param <= -32768) {
                    printf("Der Parameter ist kein gültiger short-Wert.\n");
                    return 2;
            }
    
            printf("Der Parameter ist ein gültiger short-Wert.\n");
    }
    Getestet unter OpenBSD 5.6:
    Code:
    $ ./strtol_test 42                                                               
    Der Parameter ist ein gültiger short-Wert.
    $ ./strtol_test 42424242424242424242424242
    Der Parameter ist kein gültiger short-Wert.
    $ ./strtol_test abcde                      
    Der Parameter ist kein gültiger short-Wert.
    $ ./strtol_test 123abcde
    Der Parameter ist kein gültiger short-Wert.
    $ ./strtol_test ""       
    Der Parameter ist kein gültiger short-Wert.
    $ ./strtol_test 32767
    Der Parameter ist ein gültiger short-Wert.
    $ ./strtol_test 32768 
    Der Parameter ist kein gültiger short-Wert.
    $ ./strtol_test -32768
    Der Parameter ist kein gültiger short-Wert.
    $ ./strtol_test -32767 
    Der Parameter ist ein gültiger short-Wert.
     
Thread Status:
Not open for further replies.

Share This Page