2011-09-14 30 views
35

Właśnie zacząłem czytać C++ i znalazłem C++ posiadające bogate funkcje do manipulowania ciągami, których C nie ma. Czytam tę funkcję i natknąłem się na c_str() i z tego, co rozumiem, jest c_str przekonwertować ciąg znaków, który może być zakończony zerem lub nie może być łańcuchem zakończonym znakiem Null. Czy to prawda?Co to jest użycie funkcji c_str W języku C++

Czy ktoś może zasugerować mi przykład, dzięki czemu mogę zrozumieć korzystanie z funkcji c_str?

Odpowiedz

54

c_str zwraca wartość const char*, która wskazuje na łańcuch zakończony znakiem NUL (tzn. Ciąg znaków w stylu C). Jest to przydatne, gdy chcesz przekazać "zawartość" ¹ std::string do funkcji, która oczekuje pracy z łańcuchem w stylu C.

Na przykład, należy rozważyć ten kod:

std::string str("Hello world!"); 
int pos1 = str.find_first_of('w'); 

int pos2 = strchr(str.c_str(), 'w') - str.c_str(); 

if (pos1 == pos2) { 
    printf("Both ways give the same result.\n"); 
} 

See it in action.

Uwagi:

¹ To nie jest do końca prawda, ponieważ std::string (w przeciwieństwie do łańcucha C) może zawierać znaku \0. Jeśli tak, kod, który otrzyma wartość zwracaną c_str(), zostanie oszukany na myśl, że ciąg jest krótszy niż w rzeczywistości, ponieważ interpretuje on \0 jako koniec ciągu znaków.

+0

Bardzo ciekawy punkt dokonane w notach: co chciałbym wiedzieć, czy std :: string jest już zawarta \ 0, a następnie c_str również dopisać \ 0 na końcu ciągu ?? –

+2

@AmitSinghTomar: Tak, więc będziesz mieć dwa puste bajty - jeden, który jest prawnie częścią ciągu i taki, który ma być terminatorem zerowym. Ale funkcja stylu c, która otrzymuje wskaźnik, nie wie o tym. – Jon

+0

Uwaga: pewna liczba C-API zapyta o dwa argumenty ('char const *, size_t'), przy czym drugi to oczywiście rozmiar. –

2

c_str() konwertuje łańcuch C++ na łańcuch w stylu C, który jest w istocie tablicą bajtów zakończoną znakiem NUL. Używa się go, gdy chcemy przekazać łańcuch C++ do funkcji, która oczekuje łańcucha w stylu C (np. Wiele funkcji Win32 API, funkcje stylu POSIX itd.).

+2

Nie powiedziałbym "nawróceni". Zamiast tego funkcja "zapewnia dostęp" do odpowiedniej tablicy znaków tylko do odczytu - najprawdopodobniej jest to tablica, która zawsze była tam od początku w implementacji 'std :: string'. –

4

Większość starych funkcji c + + i c, jeśli masz do czynienia z ciągami znaków, użyj const char*.
Z wersjami STL i std::string, string.c_str() została wprowadzona, aby możliwa była konwersja z std::string na const char*.

Oznacza to, że jeśli obiecasz, że nie zmienisz bufora, będziesz mógł używać zawartości tylko do odczytu. PROMISE = const char *

+0

@ Nie ma czegoś takiego jak "stl :: string". W rzeczywistości nie ma czegoś takiego jak "STL" poza tym, że gdzieś w muzeum. –

2

Jest używany do std::string współdziała z kodem C, która wymaga null zakończone char*.

29

W C++ można zdefiniować swoje struny jak

std::string MyString;

zamiast

char MyString[20];.

Podczas pisania kodu C++ napotykamy niektóre funkcje C, które wymagają parametru C jako parametru.
jak poniżej:

void IAmACFunction(int abc, float bcd, const char * cstring);

Teraz nie jest problemem. Pracujesz z C++ i używasz zmiennych łańcuchowych std::string. Ale ta funkcja C żąda ciągu C.Jak przekonwertować swój std::string na standardowy ciąg C?

Jak to:

std::string MyString; 
// ... 
MyString = "Hello world!"; 
// ... 
IAmACFunction(5, 2.45f, MyString.c_str()); 

To co c_str() jest.

Należy zauważyć, że dla std::wstring ciągów znaków, c_str() zwraca const w_char *.

0

W programowaniu C/C++ istnieją dwa typy ciągów: ciągi C i standardowe łańcuchy. W nagłówku <string> możemy użyć standardowych ciągów. Z drugiej strony, ciągi C są po prostu tablicą normalnych znaków. Tak więc w celu przekonwertowania standardowego ciągu znaków na ciąg C używamy funkcji c_str().

np

// a string to a C-style string conversion// 

const char *cstr1 = str1.c_str(); 
cout<<"Operation: *cstr1 = str1.c_str()"<<endl; 
cout<<"The C-style string c_str1 is: "<<cstr1<<endl; 
cout<<"\nOperation: strlen(cstr1)"<<endl; 
cout<<"The length of C-style string str1 = "<<strlen(cstr1)<<endl; 

a wyjście będzie,

Operation: *cstr1 = str1.c_str() 
The C-style string c_str1 is: Testing the c_str 
Operation: strlen(cstr1) 
The length of C-style string str1 = 17