Что такое использование функции c_str в c ++ - PullRequest
54 голосов
/ 14 сентября 2011

Я только начал читать C ++ и обнаружил, что в C ++ есть богатые функции для работы со строками, которых нет в C. Я читаю эти функции и наткнулся на c_str(), и, насколько я понимаю, c_str преобразует строку, которая может заканчиваться нулем или не может быть строкой с нулем. Это правда?

Может кто-нибудь предложить мне какой-нибудь пример, чтобы я мог понять использование c_str функции ??

Ответы [ 6 ]

71 голосов
/ 14 сентября 2011

c_str возвращает const char*, который указывает на строку с нулевым символом в конце (то есть строку в стиле C).Это полезно, когда вы хотите передать «содержимое» ¹ std::string функции, которая ожидает работать со строкой в ​​стиле C.

Например, рассмотрите этот код:

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");
}

См. Это в действии .

Примечания:

¹ Это не совсем так, потому что std::string (в отличие от Cстрока) может содержать символ \0.Если это произойдет, код, который получает возвращаемое значение c_str(), будет обманут, думая, что строка короче, чем она есть на самом деле, поскольку она будет интерпретировать \0 как конец строки.

43 голосов
/ 14 сентября 2011

В C ++ вы определяете свои строки как

std::string MyString;

вместо

char MyString[20];.

Во время написания кода на C ++ высталкиваются с некоторыми функциями C, для которых в качестве параметра требуется строка C.
Как показано ниже:

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

Теперь возникла проблема.Вы работаете с C ++ и используете std::string строковые переменные.Но эта функция C запрашивает строку C.Как конвертировать std::string в стандартную строку C?

Примерно так:

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

Для этого c_str().

Обратите внимание, чтодля std::wstring строк c_str() возвращает const w_char *.

6 голосов
/ 14 сентября 2011

Большинство OLD-функций c ++ и c при работе со строками используют const char*.
С STL и std::string введено string.c_str() для возможности преобразования из std::string в const char*.

Это означает, что если вы пообещаете не менять буфер, вы сможете использовать содержимое строки только для чтения. PROMISE = const char *

3 голосов
/ 23 мая 2016

В программировании на C / C ++ есть два типа строк: строки C и стандартные строки.С заголовком <string> мы можем использовать стандартные строки.С другой стороны, строки C - это просто массив нормальных символов.Итак, чтобы преобразовать стандартную строку в строку C, мы используем функцию c_str().

, например,

// 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;

. И результат будет:

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
3 голосов
/ 14 сентября 2011

Используется для обеспечения взаимодействия std::string с кодом C, который требует нулевого завершения char*.

3 голосов
/ 14 сентября 2011

c_str () преобразует строку C ++ в строку стиля C, которая по сути является нулевым завершенным массивом байтов. Вы используете его, когда хотите передать строку C ++ в функцию, которая ожидает строку в стиле C (например, множество Win32 API, функции стиля POSIX и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...