argv[1] wird in IF-Abfrage nicht korrekt intepretiert



  • int main(int argc,char **argv) {
    	if(argv[1] == "1") {
    		std::cout << "Erfolg";
    	 } else {
    		 std::cout << "Fehler";
    	 }
    
      // ...
     }
    

    Wenn ich dies mit "programm 1 blax blay" aufrufe, werden zwar "blax" und "blay" im weiteren Programmverlauf (in einer Schleife) korrekt verwendet, aber die Abfrage oben ergibt immer "Fehler" als Ausgabe.

    Kann mir jemand weiterhelfen, wo das Problem liegen könnte? 😞



  • strncmp



  • Die Ausgabe mit "strncmp" ist leider identisch zu meinem o. g. Versuch. 😞



  • getestet schrieb:

    Die Ausgabe mit "strncmp" ist leider identisch zu meinem o. g. Versuch. 😞

    Bei deinem code werden Adressen verglichen, die natürlich nicht identisch sind.

    Und ich frage mich ob du bei der Verwendung von strcmp auch darauf geachtet hast, dass wenn beide Strings identisch sind der Rückgabewert 0 ist.

    Sprich der Test so aussieht:

    if(!strcmp(argv[1],"1")){
        std::cout << "Erfolg";
    }...
    

    bzw

    if(strcmp(argv[1],"1") == 0){
        std::cout << "Erfolg";
    }...
    

    BR
    Vinzenz



  • Jetzt bin ich aber baff, so geht es.

    Prinzipiell ist mir das auch nachvollziehbar so, aber wieso kann ich dann beispielsweise "argv[1]" ausgeben und erhalte dann den STRING und keine Adresse? Wobei ich eine solche auch schon erhielt, weiß jedoch peinlicherweise nicht mehr, unter welchem Szenario.

    Vielleicht kannst du (od. sonstwer) mir zwei-drei Sätze dazu schreiben, od. ein Link wäre auch schon nett.

    Vielen Dank nochmal!



  • int main(int argc,char **argv) { 
        if(*argv[1] == '1') { 
            std::cout << "Erfolg"; 
         } else { 
             std::cout << "Fehler"; 
         } 
    
      // ... 
     }
    

    if(*argv[1] == '1')



  • staunend schrieb:

    Prinzipiell ist mir das auch nachvollziehbar so, aber wieso kann ich dann beispielsweise "argv[1]" ausgeben und erhalte dann den STRING und keine Adresse? Wobei ich eine solche auch schon erhielt, weiß jedoch peinlicherweise nicht mehr, unter welchem Szenario.

    Wenn std::cout auf einen Zeiger auf char erhält, gibt es nicht die adresse aus, sondern interpretiert es als C-String. Bei einem anderen zeiger, z.B. void*, gibt er die adresse aus. So erhälst du auch bei char* die ausgabe der adresse: std::cout << reinterpret_cast<void*>(argv[1]);

    mfg.



  • staunend schrieb:

    Jetzt bin ich aber baff, so geht es.

    Ja denkst du wir reden nur Blödsinn!? 😉

    staunend schrieb:

    Vielleicht kannst du (od. sonstwer) mir zwei-drei Sätze dazu schreiben, od. ein Link wäre auch schon nett.

    In C werden Zeichenketten als eine Aneinanderreihung von Zeichen aufgefasst. Bei'm Zeichen '\0' ( = Null, 0 ) ist die Zeichenkette zu ende:

    "Hello, C!" = 'H', 'e', 'l', 'l', 'o', ' ', 'C', '!', '\0'

    Zeichenketten werden in C üblicherweise in einem Array abgelegt:

    char str[ ] = "Hello, C!";
    

    Nehmen wir nun an, das array str beginne an 0x0012FECC, dann lägen

    'H'  an 0x0012FECC
    'e'  an 0x0012FECD,
    'l'  an 0x0012FECE,
    'l'  an 0x0012FECF,
    'o'  an 0x0012FED0,
    ','  an 0x0012FED1,
    ' '  an 0x0012FED2,
    'C'  an 0x0012FED3,
    '!'  an 0x0012FEC4 und
    '\0' an 0x0012FEC5
    

    Möchten wir nun diesen String ausgeben, so geben wir

    #include <cstdio>
    
    using namespace std;
    
    int main( )
    {
        char str[ ] = "Hello, C!";
    
        puts( str ); // die Adresse von str,
    
        // was identisch zur Adresse des ersten Zeichens ist:
    
        puts( &str[ 0 ] );
    }
    

    Das Parameterarray argv in

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

    ist nun ein Array aus Strings.

    Greetz, Swordfish


Log in to reply