name herausfinden der ausgeführten anwendung
-
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
-
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 ProgrammnameDas erste Argument _muss_ nicht unbedingt der Programmname sein.
-
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.
-
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.

-
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.
-
SeppJ schrieb:
da drin darfste rumschreiben wie du lustig bist.
Darf man?
-
314159265358979 schrieb:
SeppJ schrieb:
da drin darfste rumschreiben wie du lustig bist.
Darf man?
Ja. Im Standard kann ich nix gegenteiliges finden (falls du eine Stelle kennst die etwas anderes sagt, nur her damit), der Typ passt und auch und rein von der Vorstellung was da passiert ist doch klar, dass das gehen muss. main ist doch keine magische Funktion bei der auf einmal alles anders ist. Das ist eine stinknormale Funktion die vom Startupcode aufgerufen wird. Die Funktionsargumente können auch unmöglich Konstanten sein, da sie schließlich Laufzeitargumente sind. Folglich muss der Startupcode irgendwo beschreibbaren Speicher für diese Argumente her haben. Und da der Startupcode Teil des Programmes ist, darf man da auch drin rumschreiben. Oder anders gesagt: Gibt es irgendein Argument, wieso das nicht so sein sollte?
(Außerdem kann man sich leicht durch Ausprobieren davon überzeugen, dass es mindestens auf den großen Plattformen funktioniert)
Im C99 Standard steht sogar noch ausdrücklich eine Klausel, dass es beschreibbar sein soll. Kann in C++11 jedoch nix in der Art finden, aber auch nichts gegenteiliges. Wäre ja auch doppelt gemoppelt, das ausdrücklich zu erlauben, da die Typen passen und es nicht verboten ist. Die einzige Klausel dieser Art ist bei Stringliteralen, weil diese aus historischen Gründen auch als nicht-const behandelt werden können. Da steht dann ausdrücklich, dass das Ausnutzen der nicht-constness undefiniert ist.
-
Ich mein nur, vielleicht brauchst du ja argv[0] später noch einmal. Dann könntest du bereits darin herumgeschrieben haben, und- hast nicht mehr den eigentlichen Programmnamen.