Porównanie 2 ścieżek z GetModuleFileName i z tablicy charów


(kox8161) #1

Witam,

mam takowy problem, chcę by mój program porównywał swoją obecną ścieżkę do ścieżki zapisanej wcześniej do zmiennej, więc napisałem taki kod:

char filename[_MAX_PATH];

    GetModuleFileName(NULL, filename, _MAX_PATH);

    char userpath[] = "D:\\program.exe";


    MessageBox(0,filename,"Sciezka obecna",MB_ICONINFORMATION);

    MessageBox(0,userpath,"Sciezka docelowa",MB_ICONINFORMATION);


    if(filename == userpath) MessageBox(0,"Sciezki takie same","Program", MB_ICONINFORMATION);

    else

        MessageBox(0,"Sciezki rozne","Program", MB_ICONINFORMATION);

niestety takie porównanie nie działa, mimo że program został uruchomiony ze ścieżki takiej jak zapisana w tablicy "userpath" warunek zawsze zwraca fałsz. Z początku myślałem że to kwestia jakiegoś białego znaku na końcu "filename" więc dodawałem do "urespath" \n, \0 ale nic nie działa, teraz już nie mam pomysłu.


(Grzelix) #2

Czytając dokumentację masz

lpFilename [out]


A pointer to a buffer that receives the fully qualified path of the module. If the length of the path is less than the size that the nSize parameter specifies, the function succeeds and the path is returned as a null-terminated string.

http://msdn.microsoft.com/en-us/library ... 97(v=vs.85.aspx

czyli powinieneś dodać '\0' na końcu userpath.

Natomiast do porównania spróbuj użyć strcmp


(Rolek0) #3

Łańcuchy znakowe w C i C++ są standardowo zakończone \0, więc nic nie musi dodawać.

@kox8186

W C i C++ nie można porównywać tablic.

Tablica jest niejawnie konwertowana na wskaźnik do jej pierwszego elementu i porównujesz wskaźniki, a że oba napisy znajdują się w innych miejscach w pamięci to wychodzi fałsz :wink:

Porównywać napisy możesz strcmp, który zwraca 0 dla równych napisów.


(kox8161) #4

Dziękuję za pomoc.

Faktycznie do końca "userpath" nic nie musiałem dodawać. Funkcja "strcmp" zdała egzamin porównała zawartość tych dwóch tablic char'ów a nie tak jak to robił if porównanie adresów.

Problem rozwiązany temat do zamknięcia.