std :: string を char * または char [] に変換したい。
std::string str = "string";
char* chr = str;
結果は次のようになります。 「エラー:「std :: string」を「char」に変換できません...」 。
これを行うにはどのような方法がありますか?
自動的には変換されません(神に感謝)。 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);
もし私が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 []で割り当てられることを期待することはほとんどありません。
(この答えは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*
同じ内容を表す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::string
をchar*
に変換する必要がある場合は、const_cast
があなたの友達です。
std::string str = "string";
char* chr = const_cast<char*>(str.c_str());
これは ではない あなたにデータのコピーを与えることに注意してください。それはあなたに文字列へのポインタを与えるでしょう。したがって、chr
の要素を変更すると、str
も変更されます。
入力として渡すためにCスタイルの文字列が必要だと仮定します。
std::string str = "string";
const char* chr = str.c_str();
厳密に理解するために、「std :: stringをchar *またはchar []データ型に変換することはできません」
他の答えが示しているように、std :: stringの内容をchar配列にコピーするか、std :: stringの内容にconst char *を作成して "Cスタイル"でアクセスできるようにすることができます。 。
Std :: stringの内容を変更しようとしている場合、std :: string型には、必要に応じて実行できるすべてのメソッドがあります。
あなたがchar *を取る何らかの関数にそれを渡そうとしているならば、std :: string :: c_str()があります。
完全を期すために、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);
これは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
char* result = strcpy((char*)malloc(str.length()+1), str.c_str());
あるいは、以下に示すように、ベクトルを使って書き込み可能な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
あなたはイテレータを使ってそれを作ることができます。
std::string str = "string";
std::string::iterator p=str.begin();
char* chr = &(*p);
がんばろう。
Unique_ptrを使用したorlpのchar *回答の安全版
std::string str = "string";
auto cstr = std::make_unique<char[]>(str.length() + 1);
strcpy(cstr.get(), str.c_str());
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")
これも動作します
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;