2017-12-16 14 views
0

Ich möchte mein Programm in 2 verschiedenen Pfaden schreiben. Also ging ich wie folgt aus:getenv in C++ gibt falsche Werte zurück

std::string path1 = strcat(std::getenv("APPDATA"),"\\myprog.exe") ; 
std::string path2 = strcat(std::getenv("APPDATA"),"\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\myprog.exe") ; 

Wenn ich drucken, erhalte ich:

C:\Users\thispc\AppData\Roaming\myprog.exe 
C:\Users\thispc\AppData\Roaming\myprog.exe\Microsoft\Windows\Start Menu\Programs\Startup\myprog.exe 

statt:

C:\Users\thispc\AppData\Roaming\myprog.exe 
C:\Users\thispc\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\myprog.exe 

Lösung von Dietmar Kühl:

std::string path1 = std::getenv("APPDATA") + std::string("\\myprog.exe"); 

Erklärung von Oliver Charlesworth: strcat() ändert die erste Variable

+2

Sie deutlich das Ergebnis des ersten Anrufs ändern, um 'std :: getenv()' (was, glaube ich, eigentlich illegal ist) kopieren soll. Solltest du etwas wie 'std :: string path1 = std :: getenv (" APPDATA ") + std :: string (" \\ myprog.exe ") schreiben?' '? –

+3

'strcat' modifiziert den String, auf den das erste Argument zeigt. Das ist im Allgemeinen legal, aber nicht in diesem speziellen Fall - Sie wissen nicht, wie viel Speicher dafür reserviert wurde. –

Antwort

0

Was hier geschieht, ist, dass std::getenv("APPDATA") Sie auf eine bereits geschrieben Zeichenfolge irgendwo im Speicher einen Zeiger gibt, dass der Zeiger bedeutet, von dieser Funktion zurück wird immer die gleich.

Also, wenn Sie strcat(std::getenv("APPDATA"),"\\myprog.exe") tun, verketten Sie im Grunde diese gespeicherte Zeichenfolge im Speicher mit "\\myprog.exe". Wenn Sie also einen zweiten Anruf von std::getenv("APPDATA") tätigen, erhalten Sie die verkettete Zeichenfolge.

Um dieses Problem zu lösen Sie die Saite an std::getenv("APPDATA")

Verwandte Themen