Befehlszeilenargumente für main() Frage



  • Hallo

    Um einem Programm Parameter mitzugeben wir die main - Funktion mit folgenden Parametern modifiziert.

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

    Dazu hätte ich mal folgende Frage:

    char* argv[] definiert nach meinem bescheidenen Wissen ein Array von char - Pointern. Ein char - Pointer kann doch nur auf ein Zeichen zeigen oder ?
    Wie ist es dann möglich z.B. ein Wort zu übergeben. Ich habe dazu mal ein Programm
    geschrieben das so aussieht.

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main(int argc, char* argv[])
    {
       cout << endl;
       cout << "Belehlszeielargument:" endl << endl;
    
       for(int i = 0; i < argc; i++)
       {
           cout << " " << i << ".Argument: "
           << argv[i] << endl;
       }
    
    return 0;
    }
    

    Ok geht jetzt mehr in Richtung C++ aber die Frage ist. Wenn ich zum Beispiel als Parameter " Du dumme Sau " übergebe werden mir 4 Parameter angezeigt.

    1. Name des Programms mit Pfad
    2. Du
    3. dumme
    4. Sau

    Aber eigentlich können die char - Pointer die in argv[] liegen duch nur auf ein Zeichen zeigen. Wie ist das mit den Parametern 1 - 4 das sind doch Wörter.

    Wo liegt mein Fehler. Schon mal Danke für eure Hilfe.

    mfg
    Fujittsu



  • ⚠ Denkfehker.
    Der char* zeigt immer auf das erste Zeichen des Strings.

    Ein Wort oder String ist in C eine Reihe Zeichen, die durch ein '\0' Zeichen abgeschlossen sind.

    Wenn du nun auf ein Zeichen mit einem char* zeigst, werden bei Stringfunktionen einfach munter die nachfolgenden Speicherstellen mitgenommen (bis zur '\0').



  • Danke für deine Hilfe. Das muss ich mir woll noch mal ansehen.

    mfg
    Fujittsu



  • Mach mal.

    Das ist ganz wichtig in C.
    Das Kapitel heißt dann ungefähr: Zeiger/Pointer und Vektoren/Arrays/Felder.



  • fujittsu schrieb:

    Ein char - Pointer kann doch nur auf ein Zeichen zeigen oder ?

    Richtig erkannt. Ein char* ist ein Zeiger auf ein char (und nichts anderes). Was du mit diesem Zeiger dann machst, wie du ihn interpretierst, ist deine Sache. Z.B. wird oft damit der Beginn einer '\0' abgeschlossenen char-Kette gemeint (=String) und verschiedene Standardbibliotheksfunktionen str* gehen davon aus, dass auch irgendwo ein '\0' vorkommt, bei dem sie dann stoppen. Wenn nicht, liegen meist uninitialisierte Speicherbereiche vor und bedeuten undefniertes Verhalten des Programms.

    fujittsu schrieb:

    Wie ist es dann möglich z.B. ein Wort zu übergeben.

    Ein String ist '\0' abgeschlossen, ein Wort üblicherweise mit Leerzeichen oder Whitespaces, d.h. Wort und String sind nicht dasgleiche. Du übergibst deinem Programm zwar die Liste von Worten, der Kommandozeileninterpreter/Shell zerstückelt sie mit den üblichen Defaults aber bei jedem Leerzeichen/Whitespaces sodass das Programm 3 Parameter sieht und nicht bloß einen. Weise den Kommandozeileninterpreter an, die Wörter als eine Zeichenkette anzusehen, d.h. umschließe sie mit <"> oder nutze unter Unix die Shellvariable IFS. Ist aber spätestens ab hier offtopic.


Anmelden zum Antworten