C ++ string
をchar配列に変換するc_str
ことは、string の関数を使用して、それを実行するのと同じくらい簡単strcpy
です。しかし、どのように反対をするのですか?
:私のようなchar配列を持っているchar arr[ ] = "This is a test";
に変換し、バックをします:
string str = "This is a test
。
C ++ string
をchar配列に変換するc_str
ことは、string の関数を使用して、それを実行するのと同じくらい簡単strcpy
です。しかし、どのように反対をするのですか?
:私のようなchar配列を持っているchar arr[ ] = "This is a test";
に変換し、バックをします:
string str = "This is a test
。
回答:
この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;
"hello world"
は配列です。使用sizeof("hello world")
すると、ポインタのサイズ(4または8の可能性があります)ではなく、配列のサイズ(12)が得られます。
string
コンストラクタは、との仕事は、例えば、渡される引数文字列は、として宣言されていないだろうunsigned char * buffer
ライブラリを扱うバイトストリームでは非常に一般的な何か、。
std::string str(buffer, buffer+size);
が、それはに固執する方が良いだろううstd::vector<unsigned char>
、その場合には。
str
はありません。文字列変数の名前です。他の変数名(例:)を使用できますstring foo(arr);
。変換は、暗黙的に呼び出されるstd :: stringのコンストラクターによって行われます。
別の解決策は次のようになります、
char arr[] = "mom";
std::cout << "hi " << std::string(arr);
余分な変数の使用を避けます。
cout << "test:" + std::string(arr);
string aString(someChar);
ですか、ここで使用できるキーですか?
上位投票の回答で見逃された小さな問題があります。つまり、文字配列には0が含まれる可能性があります。上記のように単一のパラメーターでコンストラクターを使用すると、一部のデータが失われます。可能な解決策は次のとおりです。
cout << string("123\0 123") << endl;
cout << string("123\0 123", 8) << endl;
出力は次のとおりです。
123
123 123
std::string
バイナリデータのコンテナーとして使用していて、配列に '\ 0'が含まれていないことを確認できない場合に、より適切な回答です。
#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
const char*
を受け取るので、文字列リテラルまたはchar配列を渡すことができます(これはそれに崩壊します)。