2011-12-09 51 views
0

私は上記の操作を実行したいと思いますが、char配列が手元の文字列とまったく同じサイズであることを確認したいと思います。C++、文字列から文字配列への変換

実際の質問は、ランタイムに決定されるサイズの配列を作成するにはどうすればいいですか?

答えて

3

std::string s("abcdef"); 

... 
char* chars=strdup(s.c_str()); 

:空き店舗にメモリを割り当てると、一度に文字列をコピー

char* res = new char[str.size()+1]; 
strncpy(res, str.c_str(), str.size()+1); 
+1

'string'に埋め込みヌル文字が含まれている場合、' strncpy'はデータを切り捨てます。 'memcpy'がより適切です。あるいは' std :: vector <> 'のような適切なコンテナです。 – ildjarn

-1

文字列の長さを見つけるにはstrlen()を使用し、次にそのサイズの文字配列malloc()を使用します。

あなたは「新しい」演算子で、実行時に既知のサイズの配列を作成することができます
5

もちろん、メモリを手動で解放する必要があります。例: man page。 @Lokiの言及通り:deleteではなく、free(chars)で解放されています。また、<cstring>ヘッダーを含める必要があります。

C++世界に滞在したい場合は、vectorを使用してください。 2つのイテレータを使用してデータをコピーし、ヒープに割り当てると、が単独でクリーンアップされます。それは治療法ではありませんか?

std::vector<char> vec(s.begin(), s.end()); 
+0

今度はあなたのコードをfree()で補う必要があります。したがって、ここでは1行に保存されますが、管理する2つの異なるメモリプールがあるため、コードがはるかに複雑になります。 –

+0

@ LokiAstari:それは本当です。私はそれを付け加えておくべきです - 個人的に私はベクトルアプローチを好む。 – xtofl

+1

+1は 'std :: vector <>'を推奨しています。 – ildjarn

2
std::string s = "hello"; 
char* c = new char[s.length() + 1]; // '+ 1' is for trailing NULL character. 

strcpy(c, s.c_str()); 
1
#include <string> 

int main(int argc, char *argv[]) 
{ 
    std::string random_data("This is a string"); 

    char *array=new char[random_data.size()+1]; 

    // do stuff 

    delete[] array; 

    return 0; 
} 
1

試してみてください。

​​

または:(好ましくは)

std::vector<char> res(str.begin(), str.end()); 

または:あなたがしたいすべてがC-慰めを呼び出している場合:

str.c_str()