name herausfinden der ausgeführten anwendung



  • 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.



  • Da es sich offenbar um Windows handelt, hier noch eine Lösung:

    namespace Win32
    {
      typedef std::basic_string<TCHAR> string;
    
      string getImageName()
      {
        TCHAR buffer[MAX_PATH];
        DWORD length = GetModuleFileName(0, buffer, MAX_PATH);
        if (length < 1)
          throw std::runtime_error("GetModuleFileName() failed");
        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
          throw std::runtime_error("buffer too small");
        TCHAR* begin = buffer + length;
        while (begin > buffer && *(begin - 1) != '\\' && *(begin - 1) != '/')
          --begin;
        return begin;
      }
    }
    


  • SeppJ schrieb:

    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;
    

    Und jetzt rate mal, was passiert, wenn du da was veränderst (denk an das Motto von Toyota). 😉

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


  • proggebber schrieb:

    Im Standard steht nur was von "sollte".

    Hehe, jo, 1 + 1 sollte auch nur zwei ergeben, eventuell baust du jetzt schnell ganz viele asserts in dein Programm. 😃


  • Mod

    Hacker schrieb:

    Na gut:, hier:

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

    Und jetzt rate mal, was passiert, wenn du da was veränderst (denk an das Motto von Toyota). 😉

    Dann passiert genau das was passieren soll. Die Programmargumente sind keine Literale, da drin darfste rumschreiben wie du lustig bist.


Anmelden zum Antworten