Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
c:func:main:parameter [2011/11/01 22:39]
127.0.0.1 Externe Bearbeitung
c:func:main:parameter [2022/09/22 19:58] (aktuell)
Zeile 3: Zeile 3:
 ===== Kommandozeilenparameter ===== ===== Kommandozeilenparameter =====
  
-Kommandozeilenparameter sind ein oft gesehener Weg um einem Programm Werte zu übergeben. Doch wie kann man so etwas in C realisieren?​ Da der Eintrittspunkt in unser Programm immer die main-Funktion ist, ist es auch nicht weiter verwunderlich,​ dass wir auch an dieser Stelle die in der Kommandozeile eingegebenen Werte erhalten können. Damit das funktioniert müssen wir eine spezielle Definition für die main-Funktion verwenden, die Variablen bereitstellt in die die Kommandozeilenargumente gespeichert werden.+Kommandozeilenparameter sind ein oft gesehener Weg um einem Programm Werte zu übergeben. Doch wie kann man so etwas in C realisieren?​ Da der Eintrittspunkt in unser Programm immer die ''​main''​-Funktion ist, ist es auch nicht weiter verwunderlich,​ dass wir auch an dieser Stelle die in der Kommandozeile eingegebenen Werte erhalten können. Damit das funktioniertmüssen wir eine spezielle Definition für die ''​main''​-Funktion verwenden, die Variablen bereitstellt in die die Kommandozeilenargumente gespeichert werden.
  
-===== Einen neue main-Funktion =====+===== Eine neue main-Funktion =====
  
-Die neue main-Funktion soll zwei Parameter erwarten. Der erste ist ein Integer, in den die Anzahl der übergebenen Argumente geschrieben wird, wobei die Grenze zwischen zwei Argumenten immer ein Whitespace ist. Der zweite Parameter enthält schließlich ein Array von Char-Zeigern,​ die auf die Werte der übergebenen Argumente zeigen. +Die neue ''​main''​-Funktion soll zwei Parameter erwarten. Der erste ist ein Integer, in den die Anzahl der übergebenen Argumente geschrieben wird, wobei die Grenze zwischen zwei Argumenten immer ein [[glossary:Whitespace]] ist. Der zweite Parameter enthält schließlich ein Array von Char-Zeigern,​ die auf die Werte der übergebenen Argumente zeigen. 
-Es ist üblich die Parameter mit '​argc'​ (=argument count) für die Anzahl der Argumente und '​argv'​ (=argument values) ​für die Werte der Argumente ​zu bezeichen. Die beiden am häufigsten verwendeten Definitionen der main-Funktion schauen deshalb auch so aus:+Es ist üblich die Parameter mit ''argc'' ("argument count") für die Anzahl der Argumente und ''argv'' ("argument values") zu bezeichnen. Die beiden am häufigsten verwendeten Definitionen der ''​main''​-Funktion schauen deshalb auch folgendermaßen ​aus:
  
 <code cpp>int main( int argc, char **argv ​ ) <code cpp>int main( int argc, char **argv ​ )
 int main( int argc, char* argv[] )</​code>​ int main( int argc, char* argv[] )</​code>​
  
-Wie man sieht ist es auch völlig egal ob man für die Werte der Argumente einen Doppelzeiger oder ein Array von Zeigern verwendet, da diese in C/C++ beinahe gleich behandelt werden. Eventuell ist für den einen oder anderen die zweite ​Variant ​etwas intuitiver, da man auf den ersten Blick erkennen kann, dass es sich um ein Array handelt.+Wie man sieht ist es auch völlig egalob man für die Werte der Argumente einen Doppelzeiger oder ein Array von Zeigern verwendet, da diese in C/C++ beinahe gleich behandelt werden. Eventuell ist für den einen oder anderen die zweite ​Variante ​etwas intuitiver, da man auf den ersten Blick erkennen kann, dass es sich um ein Array handelt.
  
 ===== Ein erstes Programm ===== ===== Ein erstes Programm =====
  
-So, jetzt können wir ein erstes Programm mit der neuen main-Funktion schreiben und geben den Wert der Variablen '​argc',​ also die Anzahl der übergebenen Argumente aus:+So, jetzt können wir ein erstes Programm mit der neuen ''​main''​-Funktion schreiben und geben den Wert der Variablen '​argc',​ also die Anzahl der übergebenen Argumente aus:
  
 <code cpp>#​include <​stdio.h>​ <code cpp>#​include <​stdio.h>​
Zeile 28: Zeile 28:
 }</​code>​ }</​code>​
  
-Wenn wir dieses Programm jetzt kompilieren und ausführen werden wir feststellen,​ dass wir bereits ein Argument erhalten obwohl wir keines angegeben haben. Das liegt daran, dass uns das Betriebssystem immer als erstes Argument den Namen des ausgeführten ​Programmes ​mit der gesamten Pfadangabe mit der das Programm aufgerufen wurde übergibt. Jetzt fügen wir nach der Ausgabe der Anzahl der Argument noch folgende Zeile ein, um das erste Argument auszugeben:+Wenn wir dieses Programm jetzt kompilieren und ohne weitere Argumente ​ausführenwerden wir feststellen,​ dass wir bereits ein Argument erhalten obwohl wir keines angegeben haben. Das liegt daran, dass uns das Betriebssystem immer als erstes Argument den Namen des ausgeführten ​Programms ​mit der gesamten Pfadangabe mit der das Programm aufgerufen wurde übergibt. Jetzt fügen wir nach der Ausgabe der Anzahl der Argument noch folgende Zeile ein, um das erste Argument auszugeben:
  
 <code cpp>​printf("​Pfad:​ %s\n", argv[0]); // Erstes Argument ausgeben</​code>​ <code cpp>​printf("​Pfad:​ %s\n", argv[0]); // Erstes Argument ausgeben</​code>​
  
-Wenn wir das Programm jetzt erneut kompilieren und ausführen können wir erkenne, dass jetzt wirklich der Programmname mit dem Pfad ausgebene ​wird.+Wenn wir das Programm jetzt erneut kompilieren und ausführenkönnen wir erkennen, dass jetzt wirklich der Programmname mit dem Pfad ausgegeben ​wird.
  
 ===== Argumente erhalten ===== ===== Argumente erhalten =====
  
-Jetzt sind wir aber endlich soweit und werden gleich auch weitere Argumente auswerten die wir erhalten. Wenn wir unser Programm erneut ausführen und im dieses Mal aber auch ein paar Argumente mit übergeben können wir sehen, dass die Anzahl der Argumente tatsächlich stimmt. Falls wir es noch nicht getan haben öffnen wir jetzt also eine Konsole, wechseln in das Verzeichnis mit unserem Programm, und führen es zum Beispiel mit folgendem Befehl aus ('​MainParamTest'​ müssen wir natürlich durch den wirklichen Namen der ausführbaren Datei ersetzen):+Jetzt sind wir aber endlich soweit und werden gleich auch weitere Argumente auswerten die wir erhalten. Wenn wir unser Programm erneut ausführen und ihm dieses Mal aber auch ein paar Argumente mit übergebenkönnen wir sehen, dass die Anzahl der Argumente tatsächlich stimmt. Falls wir es noch nicht getan haben öffnen wir jetzt also eine Konsole, wechseln in das Verzeichnis mit unserem Programm, und führen es zum Beispiel mit folgendem Befehl aus (''​MainParamTest'' müssen wir natürlich durch den wirklichen Namen der ausführbaren Datei ersetzen):
  
 <​code>​./​MainParamTest -param1=bla test.h aha 123</​code>​ <​code>​./​MainParamTest -param1=bla test.h aha 123</​code>​
Zeile 45: Zeile 45:
 Pfad: ./​MainParamTest</​code>​ Pfad: ./​MainParamTest</​code>​
  
-Wir können also erkennen, dass wir eigentlich nur die Kommandozeile auf Strings aufgeteilt bekommen, wobei die Trennung immer an der Stelle von Whitespaces erfolgt. Damit wir die übergebenen Werte jetzt auch verwenden können brauchen wir sie nur mehr aus dem Array '​argv'​ auslesen. Wichtig ist dabei, dass wir nicht über die Grenzen des Arrays hinauslesen,​ dessen Größe ​in '​argc' ​steht.+Wir können also erkennen, dass wir eigentlich nur die Kommandozeile auf Strings aufgeteilt bekommen, wobei die Trennung immer an der Stelle von Whitespaces erfolgt. Damit wir die übergebenen Werte jetzt auch verwenden könnenbrauchen wir sie nur mehr aus dem Array ''argv'' auslesen. Wichtig ist dabei, dass wir nicht über die Grenzen des Arrays hinauslesen,​ dessen Größe ​über ''​argc'​' bekannt ist.
  
 ===== Argumente ausgeben ===== ===== Argumente ausgeben =====
Zeile 66: Zeile 66:
 }</​code>​ }</​code>​
  
-Wenn wir dieses Programm jetzt gleich wie vorher aufrufen erhalten wir jetzt eine Liste mit den übergebenen Argumenten, die auf meinem Computer zum Beispiel so ausschaut:+Wenn wir dieses Programm jetzt gleich wie vorher aufrufenerhalten wir jetzt eine Liste mit den übergebenen Argumenten, die auf meinem Computer zum Beispiel so ausschaut:
  
 <​code>​Anzahl der Argumente: 5 <​code>​Anzahl der Argumente: 5
Zeile 95: Zeile 95:
 }</​code>​ }</​code>​
  
-Ein Aufruf dieses ​Programme ​mit den Argumenten+Ein Aufruf dieses ​Programms ​mit den Argumenten
  
 <​code>​./​MainParamTest -enable-this file.txt</​code>​ <​code>​./​MainParamTest -enable-this file.txt</​code>​
  
-erzeugt dabei bei mir zum Beispiel ​folgenden ​Ausgabe:+erzeugt dabei bei mir zum Beispiel ​folgende ​Ausgabe:
  
 <​code>'​this'​ aktiviert. <​code>'​this'​ aktiviert.
Zeile 107: Zeile 107:
  
 ---- ----
-[[http://forum.proggen.org/​viewtopic.php?​f=39&​t=400|Autorendiskussion]]+[[https://www.proggen.org/forum/​viewtopic.php?​f=39&​t=400|Autorendiskussion]]