web-dev-qa-db-ja.com

std :: charからchar *へ

std :: string char * または char [] に変換したい。

std::string str = "string";
char* chr = str;

結果は次のようになります。 「エラー:「std :: string」を「char」に変換できません...」

これを行うにはどのような方法がありますか?

275
Mario

自動的には変換されません(神に感謝)。 Cの文字列バージョンを取得するには、メソッドc_str()を使用する必要があります。

std::string str = "string";
const char *cstr = str.c_str();

const char *が返されることに注意してください。 c_str()が返すCスタイルの文字列を変更することはできません。あなたがそれを処理したいならば、あなたはそれを最初にコピーしなければならないでしょう:

std::string str = "string";
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
// do stuff
delete [] cstr;

あるいは現代のC++では:

std::vector<char> cstr(str.c_str(), str.c_str() + str.size() + 1);
574
orlp

詳細はこちら 、および ここ しかしあなたは使うことができます

string str = "some string" ;
char *cstr = &str[0u];
126
bobobobo

もし私がc ++の文字列の内容の変更可能な生のコピーが必要ならば、私はこれをするでしょう:

std::string str = "string";
char* chr = strdup(str.c_str());

以降:

free(chr); 

それでは、なぜ他の人のようにstd :: vectorやnew []をいじらないのでしょうか。 変更可能なC形式の生のchar *文字列が必要なとき、それから文字列を変更するCコードを呼び出したいので、Cコードはfree()で割り当てを解除し、malloc()で割り当てます(strdupはmallocを使用します) 。だから私は私の生の文字列をいくつかの関数に渡す場合X Cで書かれて it may それがヒープに割り当てられなければならないという引数に制約がある(例えば関数が欲しい場合)パラメータでreallocを呼び出すため)。しかし、引数が(ユーザによって再定義された)new []で割り当てられることを期待することはほとんどありません。

36

(この答えはC++ 98にのみ当てはまります。)

生のchar*を使わないでください。

std::string str = "string";
std::vector<char> chars(str.c_str(), str.c_str() + str.size() + 1u);
// use &chars[0] as a char*
21
ildjarn
  • 同じ内容を表すCスタイルの文字列だけが必要な場合は、

    char const* ca = str.c_str();
    
  • new contentsを指定したCスタイルの文字列が必要な場合は、1つの方法(コンパイル時に文字列のサイズがわからないと仮定)が動的割り当てです。

    char* ca = new char[str.size()+1];
    std::copy(str.begin(), str.end(), ca);
    ca[str.size()] = '\0';
    

    後でdelete[]するのを忘れないでください。

  • 代わりに、静的に割り当てられた、限られた長さの配列が欲しいならば:

    size_t const MAX = 80; // maximum number of chars
    char ca[MAX] = {};
    std::copy(str.begin(), (str.size() >= MAX ? str.begin() + MAX : str.end()), ca);
    

std::stringは暗黙のうちにこれらの型に変換されません。これを行う必要があるのは通常設計上の匂いだからです。あなたが 本当に それを必要としていることを確認してください。

間違いなく char*が必要な場合、 best の方法はおそらく次のようになります。

vector<char> v(str.begin(), str.end());
char* ca = &v[0]; // pointer to start of vector

これはboboboboの答えに対するコメントとしてはより良いでしょう、しかし私はそのための担当者を持っていません。それは同じことを達成しますが、より良い習慣を用います。

他の答えは便利ですが、constなしで明示的にstd::stringchar*に変換する必要がある場合は、const_castがあなたの友達です。

std::string str = "string";
char* chr = const_cast<char*>(str.c_str());

これは ではない あなたにデータのコピーを与えることに注意してください。それはあなたに文字列へのポインタを与えるでしょう。したがって、chrの要素を変更すると、strも変更されます。

10
hairlessbear

入力として渡すためにCスタイルの文字列が必要だと仮定します。

std::string str = "string";
const char* chr = str.c_str();
5
Mark B

厳密に理解するために、「std :: stringをchar *またはchar []データ型に変換することはできません」

他の答えが示しているように、std :: stringの内容をchar配列にコピーするか、std :: stringの内容にconst char *を作成して "Cスタイル"でアクセスできるようにすることができます。 。

Std :: stringの内容を変更しようとしている場合、std :: string型には、必要に応じて実行できるすべてのメソッドがあります。

あなたがchar *を取る何らかの関数にそれを渡そうとしているならば、std :: string :: c_str()があります。

5
Rob K

完全を期すために、std::string::copy()を忘れないでください。

std::string str = "string";
const size_t MAX = 80;
char chrs[MAX];

str.copy(chrs, MAX);

std::string::copy()はNUL終了しません。 Cの文字列関数で使うためにNULターミネータを確実にする必要があるなら:

std::string str = "string";
const size_t MAX = 80;
char chrs[MAX];

memset(chrs, '\0', MAX);
str.copy(chrs, MAX-1);
4
Jeffery Thomas

これはProtocol Bufferからのより堅牢なバージョンです。

char* string_as_array(string* str)
{
    return str->empty() ? NULL : &*str->begin();
}

// test codes
std::string mystr("you are here");
char* pstr = string_as_array(&mystr);
cout << pstr << endl; // you are here
4
zangw
char* result = strcpy((char*)malloc(str.length()+1), str.c_str());
3
cegprakash

あるいは、以下に示すように、ベクトルを使って書き込み可能なchar *を取得することもできます。

//this handles memory manipulations and is more convenient
string str;
vector <char> writable (str.begin (), str.end) ;
writable .Push_back ('\0'); 
char* cstring = &writable[0] //or &*writable.begin () 

//Goodluck  
3
user5616653

あなたはイテレータを使ってそれを作ることができます。

std::string str = "string";
std::string::iterator p=str.begin();
char* chr = &(*p);

がんばろう。

3
TS.PARK

Unique_ptrを使用したorlpのchar *回答の安全版

std::string str = "string";
auto cstr = std::make_unique<char[]>(str.length() + 1);
strcpy(cstr.get(), str.c_str());
2
Enhex

OOPスタイルでの変換

converter.hpp

class StringConverter {
    public: static char * strToChar(std::string str);
};

converter.cpp

char * StringConverter::strToChar(std::string str)
{
    return (char*)str.c_str();
}

使用法

StringConverter::strToChar("converted string")
2

これも動作します

std::string s;
std::cout<<"Enter the String";
std::getline(std::cin, s);
char *a=new char[s.size()+1];
a[s.size()]=0;
memcpy(a,s.c_str(),s.size());
std::cout<<a;  
2
Genocide_Hoax