name herausfinden der ausgeführten anwendung



  • Tibolus schrieb:

    und wie ? 😉

    Indem du mit strchr, oder besser find() oder auch einer Stringfunktion nach dem letzten / suchst? oO





  • und wie schneide ich das jetzt?
    da brauch ich doch einmal die source 😉



  • Tibolus schrieb:

    und wie schneide ich das jetzt?
    da brauch ich doch einmal die source 😉

    mach einfach sowas in der Art

    std::string verz(argv[0]);
    std::string dateiname = verz.substr(verz.rfind('\\') + 1, verz.length() - verz.rfind('\\'));
    

    ungetestet und mehr oder weniger unsicher!



  • Mit strrchr suchst du nach dem letzten '\' in argv[0]
    strrchr (mit 2 r)

    Wenn ein \ gefunden wurde, findest du ein Zeichen weiter den Dateinamen.



  • DirkB schrieb:

    Mit strrchr suchst du nach dem letzten '\' in argv[0]
    strrchr (mit 2 r)

    Wenn ein \ gefunden wurde, findest du ein Zeichen weiter den Dateinamen.

    Wir sind im C++-, nicht im C-Forum. Diese Lösung ist praktisch unnötig C-reich, und um Performance geht es hier nicht.

    Edit: Obwohl...

    char dateiname[256];
        strcpy(dateiname, strrchr(argv[0], '\\') + 1);
    


  • char* ptr(strrchr(argv[0], '\\') + 1)
        std::string dateiname(ptr, strlen(ptr));
    

    Geht auch. Oder noch einfacher (am einfachsten):

    std::string dateiname(strrchr(argv[0], '\\') + 1);
    


  • Nachdem man sowieso einfach nur den letzten Teil such, braucht man eigentlich nix kopieren 😉



  • dot schrieb:

    Nachdem man sowieso einfach nur den letzten Teil such, braucht man eigentlich nix kopieren 😉

    Ja, siehe meinen letzten Post. 😃

    Edit: Jah, 900! Bald sind's tausend. 🕶



  • @hacker @hacker 😃
    thx it work!



  • Tibolus schrieb:

    @hacker ...

    ehm geht das auchnoch irgentwie wenn ich das in einer char variable kommt ?

    sonst kann ich damit nicht arbeiten 😛

    std::string dateiname(strrchr(argv[0], '\\') + 1);
    

    WTF heißt wenn ich das in einer char variable kommt ?? Meinst du, wenn es als C-String kommt, also wie argv[0]? Bitte deutlich schreiben! Das geht so nicht.



  • @hacker 😃

    egal

    diese methode work 1a 😃

    char dateiname[256];
    strcpy(dateiname, strrchr(argv[0], '\') + 1);

    danke
    gelöst 😉


  • Mod

    Hacker schrieb:

    Wir sind im C++-, nicht im C-Forum. Diese Lösung ist praktisch unnötig C-reich, und um Performance geht es hier nicht.

    Wozu dieser riesige Umweg? An strrchr ist nix gefährliches, wenn man einen þultigen C-String hat (und es ist hier standardgegeben ein gültiger C-String). Wir brauchen auch nix zu kopieren (wie in einer deiner Lösungen).

    Da:

    if (argc > 0) // Eine Umgebung _muss_ nicht unbedingt den Namen übergeben
        {
          char *progname = strrchr(argv[0], '/');
          if (progname) ++progname;   // Ein Zeichen weiter ist der Programmname
          else progname = argv[0];    // Kein '/' gefunden, Programm wurde ohne Pfadangabe aufgerufen 
          // progname ist nun ein gültiger C-String mit dem Programmnamen
        }
    


  • SeppJ schrieb:

    // Eine Umgebung _muss_ nicht unbedingt den Namen übergeben
    [...] // Ein Zeichen weiter ist der Programmname
    

    Das erste Argument _muss_ nicht unbedingt der Programmname sein.


  • Mod

    proggebber schrieb:

    Das erste Argument _muss_ nicht unbedingt der Programmname sein.

    Es ist, nach Standard, wenn es existiert, der Aufrufname oder "". Mein Programm deckt beides ab.



  • Im Standard steht nur was von "sollte".



  • Nö, im Standard steht genau das was SeppJ sagt (shall bedeutet im Standard muss).
    Was SeppJ vergessen hat ist, dass Pfade unter Windows '\' oder '/' enthalten können.



  • SeppJ schrieb:

    Hacker schrieb:

    Wir sind im C++-, nicht im C-Forum. Diese Lösung ist praktisch unnötig C-reich, und um Performance geht es hier nicht.

    Wozu dieser riesige Umweg? An strrchr ist nix gefährliches, wenn man einen þultigen C-String hat (und es ist hier standardgegeben ein gültiger C-String). Wir brauchen auch nix zu kopieren (wie in einer deiner Lösungen).

    Ja gut, aber deine Lösung ist ziemlich lang. Ich hab einen Einzeiler 🤡 (den ich, um deine Sicherheit zu erreichen, auch nur auf einen Zweizeiler ausweiten müsste).
    Und dazu noch mehrere Lösungen ohne Kopiererei.


  • Mod

    Hacker schrieb:

    Ja gut, aber deine Lösung ist ziemlich lang. Ich hab einen Einzeiler 🤡 (den ich, um deine Sicherheit zu erreichen, auch nur auf einen Zweizeiler ausweiten müsste).

    Na gut:, hier:

    char *progname = strrchr(argv[0], '/') + 1;
    

    Oder mit Sonderfällen:

    char *temp, *progname = (temp = strrchr(argv[0], '/')) ? temp+1 : argv[0];
    

    Und dazu noch mehrere Lösungen ohne Kopiererei.

    Sobald du auch nur std::string benutzt, hast du schon eine Komplettkopie.

    proggebber schrieb:

    Im Standard steht nur was von "sollte".

    In den 10 Geboten auch 😃 .



  • Vorsicht; jetzt komme ich mit _execlp daher (es geht ja augenscheinlich um Windows; auf POSIX-konformen Systemen entsprechend mit execlp) und schreibe nach argv[0], wozu ich lustig bin. Abhängig davon, was der TE will, wäre (windows-spezifisch) womöglich GetModuleFileName das Mittel der Wahl. Unter UNIX ist die Lage aufgrund der Existenz von Sym- und Hardlinks komplexer.

    Ansonsten bin ich der Ansicht, dass man den C++-Standard und die zehn Gebote nicht miteinander vergleichen kann. An den C++-Standard muss man sich schon halten.


Anmelden zum Antworten