web-dev-qa-db-ja.com

C ++でのc_str関数の使用とは

私はC++を読み始めたばかりで、C++にはCにはない文字列操作用の豊富な機能があることがわかりました。私はこれらの関数を読んでいて、c_str()に出くわし、c_strが理解しているのは、nullで終わる文字列またはnullで終わる文字列に変換できない文字列です。それは本当ですか?

c_str関数の使用を理解できるように、誰かが私にいくつかの例を提案できますか?

55

c_strは、nullで終わる文字列(つまり、Cスタイルの文字列)を指すconst char*を返します。 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を文字列の終わりとして解釈するため、文字列が実際よりも短いと考えて、だまされます。

73
Jon

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 *を返すことに注意してください。

44
hkBattousai

ほとんどのOLD c ++およびc関数は、文字列を処理するときにconst char*を使用します。
STLおよびstd::stringにより、std::stringからconst char*に変換できるようにstring.c_str()が導入されました。

これは、バッファを変更しないことを約束する場合、読み取り専用の文字列コンテンツを使用できることを意味します。 PROMISE = const char *

6

C/C++プログラミングには、C文字列と標準文字列の2種類の文字列があります。 <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
Linkon Ruhul

c_str()は、C++文字列をCスタイルの文字列に変換します。これは、本質的にバイトで終わるNULL配列です。 Cスタイルの文字列を必要とする関数(たとえば、多くのWin32 API、POSIXスタイルの関数など)にC++文字列を渡す場合に使用します。

3
CadentOrange

std::stringを、ヌル終端char*を必要とするCコードと相互運用可能にするために使用されます。

3
pmr