Mam funkcję w bibliotece stron trzecich napisane w C: char* fix_filename_slashes(char* path)
. Ta funkcja oczekuje, że zmieniony łańcuch C zostanie przekazany do niej, aby mógł zmienić wszystkie ukośniki w ścieżce do poprawnego użycia w oparciu o system operacyjny. Wszystkie ciągi, których używam w mojej fasadzie, są zadeklarowane jako std::string
s. Starałem się po prostu użyć foo.c_str()
jak każdej innej funkcji, która oczekuje ciąg C nie ją zmienić i spodziewa się const char *
, ale ta funkcja powoduje błąd: Error: Argument of type "const char *" is incompatible with parameter of type "char *"
C++: Prawidłowa implementacja przekazywania std :: string do funkcji C, która chce zmienić ciąg znaków?
jest wynikiem wymyśliłem:
char* tempf = const_cast<char*>(filename.c_str());
filename = std::string(fix_filename_slashes(tempf));
tempf = NULL;
za "poprawne" lub czy istnieją inne (bardziej poprawne?) Sposoby wykonania tego zadania?
EDIT
Whups. Podobno funkcja zwraca KOPIĘ ciągu znaków. Nadal jest już kilka fajnych odpowiedzi.
ma niezdefiniowane zachowanie napisane nad nim –
@Gene Bushuyev: Czy mógłbyś wyjaśnić UB, więc wiem, co jest nie tak? – Casey
21.3.6 ... const charT * c_str() const; ...."Program nie zmienia żadnej z wartości zapisanych w tablicy" – fizzer