argc und argv ??



  • guten Abend,

    ich habe schwierigkeiten das zu verstehen:

    1. if(count%2)
    2. int main(int argc, char ** argv)

    was ist gemeint mit % in der ersten Zeile ?? die argumente von main was haben sie da zu suchen ??
    im netz habe ich nichts vernünftiges zu diesen argumenten gefunden.

    vielen dank



  • 1. '%' ist der Module Operator. if(count % 2) heitß "Wenn der Rest der Division von count durch 2 nicht 0 ist, dann ..." speich, "Wenn count ungerade ist ..."

    2. Wenn ein Programm externe Information bekommen will (sprich wenn du b.z. das Programm mit Parametern gestartet hast: ./meinprog data1 data2 data3 ...), brauchst du argc und argv.

    argc entspricht der Anzahl der angegebene Parameter. Der Aufruf des Programm (im Bsp ./meinprog) ist immer das erste Parameter, d.h. argc ist immer mind. 1.
    argv ist ein Array der Größe argc+1. argv[i] ist das i. Parameter des Programms. argv[argc] ist immer NULL.



  • Zu 2: Kommandozeilen-argumente nennt sich das.
    aber ist das array nicht argc-1 groß?
    (bei argc = 5 ist doch argv[4] das letzte element)



  • manu1984 schrieb:

    (bei argc = 5 ist doch argv[4] das letzte element)

    argv[argc-1] ist das letzte Element, in dem noch etwas drinsteht. Dahinter steht noch ein mit NULL gefülltes Element.



  • manu1984 schrieb:

    (bei argc = 5 ist doch argv[4] das letzte element)

    (Offenbar) gängiges Mißverständnis:
    Zähl doch mal (am besten an den Fingern), wieviele Elemente argv[0] ... argv[4] sind und vergleiche das Ergebnis mit argc 😉



  • shit. stimmt!!!!
    aber wir meinten ja das gleiche 😉

    aber gut, dass wir gerade den beitrag haben:

    so wie oben beschrieben kann ich ja extern diese elemente bekommen.
    kann ich mit einem C-programm allerdings auch so eine kommando-zeile bauen?

    also kurz gesagt:
    ich führe ein c-programm mit kommando-zeile aus
    und das programm generiert mir dann eine neue kommandozeile.
    geht sowas?



  • Du kannst an system(), WinExec() und ähnliche Funktionen theoretisch beliebige Strings übergeben, die vom System als Kommandozeile interpretiert werden (und für das Zielprogramm auch wieder in argc/argv aufgedröselt werden).



  • okay,
    also z.b.

    system("zcat abc.gz > abc");
    

    klappt wunderbar (also wenn ich die 2 dateien abc.gz und abc statisch angebe).

    system("zcat %s > %s",argv[1],argv[2]);
    

    mag er nicht. da meckert er rum, zuviele argumente in system()



  • Dann mußt du die Befehlszeile halt erst zusammenbauen (z.B. per sprintf()) und dann an system() übergeben 😉

    char cmd[CMD_SIZE];
    sprintf(cmd,("zcat %s > %s",argv[1],argv[2]);
    system(cmd);
    


  • ach herrje, natürlich!!!!!!
    danke!!!!



  • hi
    ich hätte jetzt mal ne blöde frage
    aber wie ruft man denn ein programm mit parametern auf??



  • Unices:

    ./program param1 param2 ...
    

    Windows:

    program.[exe|com|bat|...] param1 param2 ...
    

    greetz, Swordfish


Anmelden zum Antworten