char配列を文字列に変換する方法は?


254

C ++ stringをchar配列に変換するc_strことは、string の関数を使用して、それを実行するのと同じくらい簡単strcpyです。しかし、どのように反対をするのですか?

:私のようなchar配列を持っているchar arr[ ] = "This is a test";に変換し、バックをします: string str = "This is a test

回答:


369

このstringクラスには、NULLで終了するC文字列を受け取るコンストラクターがあります。

char arr[ ] = "This is a test";

string str(arr);


//  You can also assign directly to a string.
str = "This is another string";

// or
str = arr;

2
それでもどちらの方法でも機能します。オーバーロードされた代入演算子はconst char*を受け取るので、文字列リテラルまたはchar配列を渡すことができます(これはそれに崩壊します)。
Mysticial 2012年

3
@ kingsmasher1:厳密に言うと、フォーム内の文字列"hello world" 配列です。使用sizeof("hello world")すると、ポインタのサイズ(4または8の可能性があります)ではなく、配列のサイズ(12)が得られます。
dreamlax 2012年

7
これは、NULLで終了する定数の C文字列に対してのみ機能することに注意してください。stringコンストラクタは、との仕事は、例えば、渡される引数文字列は、として宣言されていないだろうunsigned char * bufferライブラリを扱うバイトストリームでは非常に一般的な何か、。
CXJ 2014年

4
一定である必要はありません。あなたが任意のchar型のバイトのバッファを持っている場合は、他のコンストラクタを使用することができますstd::string str(buffer, buffer+size);が、それはに固執する方が良いだろううstd::vector<unsigned char>、その場合には。
R.マルティーニョフェルナンデス

2
明らかかもしれませんが、ここでは変換関数でstrはありません。文字列変数の名前です。他の変数名(例:)を使用できますstring foo(arr);。変換は、暗黙的に呼び出されるstd :: stringのコンストラクターによって行われます。
Christopher K. 14

55

別の解決策は次のようになります、

char arr[] = "mom";
std::cout << "hi " << std::string(arr);

余分な変数の使用を避けます。


これが私のMisticialの受け入れられた回答とどのように異なるかを回答で示していただけますか?
Maarten Bodewes 2014

@owlstead編集をご覧ください。答えを探してこのページに初めて出会ったときに見たかったからです。私と同じくらい馬鹿な人がこのページに出くわしたが、最初の回答を見てもそのつながりを作ることができない場合は、私の回答が彼らの助けになることを願っています。
stackPusher

5
string()はstd :: stringのコンストラクターであるため、std名前空間を使用していない場合は、名前空間stdを追加する必要があることに言及する価値があるかもしれません。例:cout << "test:" + std::string(arr);
クリストファー

1
@ChristopherK。トップ評価の回答もそうだったので、私はそれを省略しました。私の回答はその回答の補足となることを意図しているため、同じ仮定を維持しました。うまくいけば、それを理解しdoesntの誰もがあなたのコメントが表示されます
stackPusher

strは変数名string aString(someChar);ですか、ここで使用できるキーですか?
Driss Bounouar 2014年

31

上位投票の回答で見逃された小さな問題があります。つまり、文字配列には0が含まれる可能性があります。上記のように単一のパラメーターでコンストラクターを使用すると、一部のデータが失われます。可能な解決策は次のとおりです。

cout << string("123\0 123") << endl;
cout << string("123\0 123", 8) << endl;

出力は次のとおりです。

123
123 123


2
これは、std::stringバイナリデータのコンテナーとして使用していて、配列に '\ 0'が含まれていないことを確認できない場合に、より適切な回答です。
Assil Ksiksi 2017年

11
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string>

using namespace std;

int main ()
{
  char *tmp = (char *)malloc(128);
  int n=sprintf(tmp, "Hello from Chile.");

  string tmp_str = tmp;


  cout << *tmp << " : is a char array beginning with " <<n <<" chars long\n" << endl;
  cout << tmp_str << " : is a string with " <<n <<" chars long\n" << endl;

 free(tmp); 
 return 0;
}

でる:

H : is a char array beginning with 17 chars long

Hello from Chile. :is a string with 17 chars long

free(tmp)はどこにありますか?文字列はそれを処理しますか?
フセイントゥグルルブキシク2018年

1
良い質問。mallocを使用しているので、freeがそこにあるはずです。
クリスティアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.