Kommandozeilenparameter auslesen



  • Jetzt mal ne ganz dumme Frage... Wie kann ich in c (im c99-standard unter linux) Kommandozeilenparameter, die meinem Programm wenn es compiliert ist übergeben werden, ermitteln?

    Eigentlich sollte doch, wenn ich z.B. schreibe

    #include <stdio.h>
    int main ( char *arg ) {
    printf (arg);
    }
    

    die Ausgabe angezeigt werden. Und allgemein sollte ich doch damit darauf zugreifen können. Aber ich bekomme immer die Meldung "Speicherzugriffsfehler".

    Also auch wenn ich auf die einzelnen Character zugreife, geht das nicht (sonst hätt ich mir gedacht ist arg nicht durch \0 begrenzt).

    Wie macht man das?



  • Hi,

    Wenn Du nicht irgendwelche Unix-Libraries verwenden möchtest, dann wäre das eigentlich ein Fall für die Kollegen aus dem ANSI-C-Forum, soll ich Dich verschieben?

    Nur zur Info: main nimmt als Argumente die Anzahl als Integer und die Argumente selbst als Array von C-Strings entgegen, d.h. Du könntest das dann in etwa so verwenden:

    #include <stdio.h>
    
    int main(int argc, char* argval[])
    {
            for (int i=0; i<argc; ++i)
                    printf("%s\n", argval[i]);
            return 0;
    }
    


  • ich kein plan vom c99-standard, aber normal sieht die main funktion doch so aus

    int main(int argc, char **argv)
    {
      // code
    }
    

    wenn du das meinst, dann ist argc die anzahl der parameter die übergeben wurden und argv ein array der parameter die du übergeben hast - das erste item ist immer der befehlsaufruf (zB ./meinprogramm)

    mfg blan



  • Ok. Danke.

    Das scheint auch zu funktionieren.

    Nur... Das Problem das ich jetzt habe, ist, wie das Teil den Parameter tokenized...
    Ich würde gerne das ganze nicht tokenized mit allen Zeichen haben. Geht das?



  • Hm, Du möchtest also alle Kommentare in einem einzigen C-String haben? Bist Du Dir da sicher?

    Wenn ja, dann schau Dir mal man: strcat(3) an, ist jetzt aber eindeutig ein Fall für die ANSI-C-Leute.



  • Dieser Thread wurde von Moderator/in nman aus dem Forum Linux/Unix in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Frage an die Runde:

    pa = &a[0];
    [...]
    Einen Unterschied zwischen Vektor-Namen und Zeigern muss man allerdings beachten, Ein Zeiger ist eine Variable, also sind pa=a und pa++ sinnvolle Operationen. Ein Vektor-Name ist jedoch eine Konstante, nicht eine Variable: Ausdrücke wie a=pa oder a++ oder [...] sind nicht erlaubt.

    Sollte man da nicht lieber definieren:

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

    Oder bin ich da ein paar Jahre zurückgeblieben?



  • meinst du jetzt den unterschied von

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

    und

    int main(int argc, char **argv)
    

    ?
    wenn ja, ist doch wurscht ob du 1) einen pointer von char-arrays oder 2) einen pointer
    auf pointer hast.

    icepacker



  • Das ist richtig, aber in meinem K&R steht nun eben das Zitierte. Mein GCC scheint ebenfalls der Ansicht zu sein, dass man an einen Array-Namen einen Wert zuweisen darf.



  • cheopz schrieb:

    Das ist richtig, aber in meinem K&R steht nun eben das Zitierte. Mein GCC scheint ebenfalls der Ansicht zu sein, dass man an einen Array-Namen einen Wert zuweisen darf.

    Das ist bei Funktionsargumenten anders als sonst. Um es mit K&R2 zu sagen (5.3: Pointers and Arrays):

    As formal parameters in a function definition,

    char s[];

    and

    char *s;

    are equivalent; we prefer the latter because it says more explicitly
    that the variable is a pointer. When an array name is passed to a
    function, the function can at its convenience believe that it has been
    handed either an array or a pointer, and manipulate it accordingly. It
    can even use both notations if it seems appropriate and clear.
    [...]


Anmelden zum Antworten