Möglichkeit If Bedingung einfacher gestalten?



  • Hallo,

    in meinem Buch mit dem ich lerne steht, dass man lange if Bedingungen vermeiden sollte. Wie genau steht dort aber nicht. Ich brauche gerade eine If Bedingung die return 1 ausgibt, sollte zusätzlich zu dem Dateinamen weniger oder mehr als ein anderes Kommando beim aufrufen angegeben wird. Zusätzlich darf das Kommando nur Buchstaben enthalten. Ich habe es hiermit versucht, was mir aber immer eine Fehlermeldung ausgibt:

    if
        (
        (argc != 2 && (argv[1] <= 'A' || argv[1] >= 'Z'))
        || 
        (argc != 2 && (argv[1] <= 'a' || argv[1] >= 'z'))
        )
    
    test.c:9:31: error: ordered comparison between pointer and integer ('string' (aka 'char *') and 'int') [-Werror]
        if((argc != 2 && (argv[1] <= 'A' && argv[1] >= 'Z')) || (argc != 2 && (argv[1] <= 'a' && argv[1] >= 'z')))
                          ~~~~~~~ ^  ~~~
    
                       ~~~~~~~ ^  ~~~
    test.c:11:46: error: ordered comparison between pointer and integer ('string' (aka 'char *') and 'int') [-Werror]
        (argc != 2 && (argv[1] <= 'A' || argv[1] >= 'Z'))
                                         ~~~~~~~ ^  ~~~
    test.c:13:28: error: ordered comparison between pointer and integer ('string' (aka 'char *') and 'int') [-Werror]
        (argc != 2 && (argv[1] <= 'a' || argv[1] >= 'z'))
                       ~~~~~~~ ^  ~~~
    test.c:13:46: error: ordered comparison between pointer and integer ('string' (aka 'char *') and 'int') [-Werror]
        (argc != 2 && (argv[1] <= 'a' || argv[1] >= 'z'))
    

    Edit:

    So gehts:

    if
        (
        (argc != 2 && ((int) argv[1] <= 'A' || (int) argv[1] >= 'Z'))
        || 
        (argc != 2 && ((int) argv[1] <= 'a' || (int) argv[1] >= 'z'))
        )
    

    Darf ich as einfach machen? Ist der string dann nur in dem Fall ein int, oder muss ich den nach der if schleife wieder zurückwandeln?

    Edit2: Okay das ist ja alles Blödsinn, argv[1] ist ja nen string und kein char. Muss ich mir nochma anders überlegen. Ob ich so eine if schleife einfacher gestalten kann wäre trotzdem gut zu wissen



  • argv[1] ist vom Typ char* . 'A' ist aber vom Typ char .
    Daher kommt die Fehlermeldung.
    Wenn du den einzelnen Buchstaben willst, musst du noch den nächsten Index spendieren: argv[1][0]

    Du kannst isalpha() nehmen.

    Beschreib mal mit Worten, wann die Bedingung wahr sein soll.



  • Das edit (mit dem (int) cast) compiliert zwar, es funktioniert aber nicht, da es (wie du im Edit2 bemerkt hast) Blödsinn ist.

    Und es gibt keine if-Schleife, sondern nur if-Abfragen.



  • Ich möchte sicherstellen das der user ein command line argument eingibt was nur alphabetische Charakter hat. Ausserdem darf es nach dem filename nur ein argument geben.

    also zB. ./test foo

    argv[1] ist also foo, argv[1][1] würde mir dann nur das o ausgeben? Wie kombiniere ich das nun alles zusammen?

    Also mache ich zB eine if abfrage die dann über eine for loop per isalpha(argv[1][i]) und strlng(argv[1]) jeden buchstaben checkt?

    Beste Lösung oder denke ich mit der for loop zu kompliziert?



  • Dann schau dir doch mal strspn oder strpbrk aus string.h an.
    Am besten die Anderen Funktionen daraus auch noch anschauen.


Anmelden zum Antworten