sizeof mit Kommandozeilenparameter



  • Vielen Dank!

    Hat geklappt... manchmal rafft mans einfach nicht 😉

    MfG

    Matg40



  • Matg40 schrieb:

    ...
    Mit sizeof(argv[1]) kommt immer 4 (ws. das erste Zeichen...)
    ...

    Weil sizeof() zur Compilezeit ausgewertet wird. D.h. in Deinem Programm steht nach dem Kompilieren nicht mehr "sizeof(...)", sondern "4". 😃

    Wie schon gesagt: z.B. strlen() aus <cstring>.
    Oder per std::string aus <string>:

    // Wenn ich wirklich nur die Länge brauche:
    int len1 = std::string(argv[1]).length();
    
    // Wenn ich später noch Anderes machen möchte:
    std::string arg2(argv[2]);
    int len2 = arg2.length();
    

    Das hat noch den Vorteil, dass Du ab da an die sehr viel komfortableren (und für Anfänger sichereren) std::string-Manipulationen durchführen kannst.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    // Wenn ich wirklich nur die Länge brauche:
    int len1 = std::string(argv[1]).length();
    

    Schießt du gerne mit Spatzen auf Kanonen (edit: oder war's andersrum? egal)? Wenn du den String nicht weiter verarbeiten willst, brauchst du ihn auch nicht anzulegen.



  • CStoll schrieb:

    Simon2 schrieb:

    // Wenn ich wirklich nur die Länge brauche:
    int len1 = std::string(argv[1]).length();
    

    Schießt du gerne mit Spatzen auf Kanonen? Wenn du den String nicht weiter verarbeiten willst, brauchst du ihn auch nicht anzulegen.

    Ich weiß ja - sollte nur eine "Hinführung auf das folgende Beispiel" sein.
    Mir sind nur sehr wenige Programme bekannt, bei denen nur die Länge des Übergabeparameters (aber nicht dessen Inhalt) ausgewertet wird ....
    Und so habe ich ihn gleich auf die std::string-Schiene gesetzt.

    Gruß,

    Simon2.



  • Hi!

    Kann ich irgendwie den Kommandozeilenparameter (oder dann String) von ASCII in Unicode umwandeln?

    Bisher habe ich ihn intern mit L"test" simuliert (als Unicode), bekomme ihn jetzt aber als ASCII...

    MfG

    Matg40





  • Vielen Dank!

    Besonders der zweite Link hat mir sehr weitergeholfen.

    Ich habe es jetzt folgendermaßen gelöst:

    void wmain(int argc, char **argv)
    {

    ...

    int textLength = wcslen((wchar_t*) argv[1]);

    int textLengthBytes = textLength *2;

    ...

    }

    MfG

    Matg40



  • wmain ist aber nur bei MS vorhanden (also kein Standard) und wenn dann sollte argv auch vom Typ wchar_t* sein laut msdn. Außerdem sollte der Rückgabewert von main immer int sein.
    main: Program Startup: http://msdn2.microsoft.com/en-us/library/6wd819wh.aspx

    Greetz



  • Danke für die Infos!

    Momentan probier ich noch verschiedene Kombinationen aus, da ich in main() einmal Unicode verarbeiten muss (das obige Problem) und einmal ASCII...

    MfG

    Matg40



  • Die frage ist, welche unicode codierung du verwenden möchtest 🙂

    denn es gibt das UCS2(was unter windows wchar_t entspricht), UCS4, UTF-8(ist eine multibyte codierung -> ein zeichen besteht aus mehreren bytes/chars), UTF-16 UTF-32

    Wenn du unicode eh nur zur ausgabe oder zum lesen/schreiben von dateien verwenden möchtest, dann langt auch das standart main (int main (int, char**))



  • Hi!

    Ich verwende wahrscheinlich UCS2 (da ich mit wchar_t arbeiten konnte) und muss es einmal in eine Textdatei schreiben. Ansonsten benötige ich ASCII z.B. für einen Eintrag in einer Zip-Datei.

    Wenn ich wmain() verwende, klappt das mit der Textdatei, aber beim Namen des Eintrags wird immer nur das erste Zeichen übernommen (auch wenn ich es anzeigen lasse)...

    MfG

    Matg40


Anmelden zum Antworten