CHAR* argv[] verarbeiten



  • Hallo.

    Ich grübel gerade über das hier:

    int main(int argc, CHAR* argv[])
    {
        for(int a = 1; a <= argc; a++){
            if(argv[a] == "123abc"){
                // mach was
            }
            else if(argv[a] == "123def"){
                // mach was anderes
            }
            else{
                // Geht net, programm ende... 
            }
        }
        //...
    }
    

    Ich will einfach nur schauen, was im Parameter steht, und wenn ein bestimmter Paramter vorkommt, darauf reagieren.

    Ich check aber net, was ein Char* ist?
    Char ist normalerweise ein Zeichen wie z.B. a, aber was ist ein char mit einem * dran?

    Ich hab jetzt einiges mit atoi() und itoa() rumgespielt, das bringt bei mir immer einen Windows Fehler, die Anwendung müsse beendet werden.
    (Ja, den Include hab ich...)

    Ich habs auch mit sprintf probiert, das versteh ich mal gar net:

    int main(int argc, CHAR* argv[])
    {
        char buffer[10];
        char test[] = "123abc";
        sprintf(buffer, "%s", argv[a]);
        printf("%s - %s - %s\n", argv[a], buffer, test); // Ausgabe hier: 123abc - 123abc - 123abc
        if(test == buffer){ // FALSE -> WTF !?!
    

    Warum das nicht TRUE wird, erschließt sich mir absolut net. 😕

    ---
    Irgendwie hab ich dauernd Probleme mit TCHAR, CHAR* und den ganzen anderen Datentypen.
    Für Strings nimm ich normalerweise CString aber immer wenn es an etwas anderes geht, bin ich total aufgeschmissen. (Man hätte ja noch 200 Datentypen für Strings erfinden können :()
    Gibts irgendwo eine Seite, wo mal ausführlich erklärt wird, was denn der Unterschied ist und wie die konvertiert werden?

    thx.

    mfg
    trequ



  • strcmp nehmen. Mit == vergleichst du nur die Adressen.



  • * ist ein Zeiger. Und char* (btw schreibt man das klein ;)) ist ein Zeiger auf ein (Array von) char-Werten - die in C übliche Darstellungsform für Strings.

    Allerdings macht der Vergleich bei char* nicht das, was du von ihm erwartest. Der Ausdruck argv[a]=="123abc" vergleicht, ob die beiden Zeiger auf den selben Speicherbereich zeigen (und das ist idR nicht der Fall). Um zu überprüfen, ob beide Zeiger auf identische Daten verweisen, kannst du strcmp(argv[a],"123abc")==0 verwenden.



  • Ok, wenn char* ein Zeiger ist, dann ist es logisch, dass die Werte anders sind.
    (muss man wisssen - steht auf natürlich keiner internetseite :/)

    for(int a = 1; a <= argc; a++){
        if(strcmp(argv[a],"123abc")==0){
            printf("123abc argument angekommen\n");
        }
        //...
    }
    

    Ausgabe:
    123abc argument angekommen
    Dann passiert in 50% aller fälle entweder der Fall dass die Anwendung einfach festfriert (nur die Anwendung, nicht der PC) oder es geht 1 sek später ein Fenster auf:
    Meine Anwendung.exe hat einen Fehler verursacht und muss beendet werden.

    Gleiches Problem wie bei atoi und itoa, sobald ich es verwende, geht nix mehr.. fragt mich net warum.



  • Der letzte String der Kommandozeile (argv[argc]) ist ja auch NULL - und die meisten Systeme mögen es nicht besonders, wenn du dort etwas lesen willst 😉 (Sprich: Ersetz mal die Abbruchbedingung durch 'a<argc', dann sollte es funktionieren)





  • Ok, jetzt gehts, danke euch 😃

    Ich hab zwar net an das null gedacht, auch wenn ich das schon mal gelesen hatte.
    Ich hätte trotzdem erwartet, dass wenn man null mit etwas vergleicht, false raus kommt und sich net alles aufhängt...^^

    Die Links zieh ich mir bei Gelegenheit mal rein, thx.


Anmelden zum Antworten