2012-10-19 18 views
6

otrzymuję następujący błąd, gdy jest uruchamiany ten kod:Jak przekonwertować typ std :: basic_string na tablicę typu char?

syslog(LOG_ERR | LOG_USER, "%s",errorString); 

nie można przekonwertować 'const ciąg {std aka const :: basic_string}' do 'const char *' dla> argumentu '2' na ' void syslog (int, char *, ...)”inServer.cpp/PeCounter
linia 478 C/C++ problem

ja daemonizing program i odciski wartości errorString dobrze, gdy wysyłany do korzystania stdio cout, ale nie będzie drukować podczas korzystania z wywołania syslog.

Każdy sposób uzyskania std :: basic_string (char) w postaci "const char".

+1

Przesyłanie własnych odpowiedzi jest tutaj całkowicie do przyjęcia. Nie musisz uwzględniać go w pytaniu, nawet przy późniejszej edycji. –

Odpowiedz

4

c_str() lub data() funkcja członek zapewnia wskaźnik do pierwszego elementu tablicy char_type którym znajduje się ciąg. Jest on ważny, o ile sam obiekt łańcucha znaków pozostaje ważny i niezmieniony (ale należy pamiętać, że operacje, które mogą powodować ponowne przydziały, mogą spowodować unieważnienie wskaźnika - najlepiej go nie przechowywać).

+2

Tylko 'c_str()' gwarantuje terminator na końcu łańcucha. 'data()' może wskazywać na niezakończoną kopię ciągu, co jest niebezpieczne dla większości API, które oczekują 'const char *'. –

+3

@AdrianMcCarthy: Zależy od wersji C++, której używasz. W C++ 11 'data()' jest również zakończone nulem (i gwarantowane, że jest poprawne nawet w pustych łańcuchach). Tak więc w C++ 11 jedyną różnicą między 'c_str()' a 'data()' naprawdę jest const-ness. –

+0

@Matthieu M .: Masz rację - patrzyłem na poprzednią wersję specyfikacji. Mimo to wiele osób używa starych bibliotek, więc rozróżnienie może być ważne. Również 'c_str()' jest nieco bardziej sugestywny. –

Powiązane problemy