46

配列がnull で終了している場合、これは非常に簡単です。

unsigned char u_array[4] = { 'a', 's', 'd', '\0' };
std::string str = reinterpret_cast<char*>(u_array);
std::cout << "-> " << str << std::endl;

ただし、次のように、 null で終了しない unsigned char 配列をコピーする最も適切な方法は何だろうか。

unsigned char u_array[4] = { 'a', 's', 'd', 'f' };

std::string

unsigned char 配列を反復せずにそれを行う方法はありますか?

皆さん、ありがとうございました。

4

12 に答える 12

62

std::stringイテレータのペアを取り、(実装定義の方法で) に変換できるコンストラクタがあるため、これが機能します。の必要はありません。unsigned charcharreinterpret_cast

unsigned char u_array[4] = { 'a', 's', 'd', 'f' };

#include <string>
#include <iostream>
#include <ostream>

int main()
{
    std::string str( u_array, u_array + sizeof u_array / sizeof u_array[0] );
    std::cout << str << std::endl;
    return 0;
}

もちろん、「配列サイズ」テンプレート関数は、sizeof計算よりも堅牢です。

于 2011-01-14T13:49:56.050 に答える
26

どうやらstd::stringには、この場合に使用できるコンストラクターがあります。

std::string str(reinterpret_cast<char*>(u_array), 4);
于 2011-01-14T13:45:06.150 に答える
6

サイズを指定せずに文字列を構築する場合、コンストラクターは文字配列を反復処理し、null ターミネーター (文字) を探します'\0'。その文字がない場合は、長さを明示的に指定する必要があります。次に例を示します。

// --*-- C++ --*--

#include <string>
#include <iostream>


int
main ()
{
    unsigned char u_array[4] = { 'a', 's', 'd', 'f' };
    std::string str (reinterpret_cast<const char *> (u_array),
                     sizeof (u_array) / sizeof (u_array[0]));
    std::cout << "-> " << str << std::endl;
}
于 2011-01-14T13:47:54.053 に答える
4

これはそれを行う必要があります:

std::string s(u_array, u_array+sizeof(u_array)/sizeof(u_array[0]));
于 2011-01-14T13:47:39.760 に答える
3

std::string には assign というメソッドがあります。char * と size を使用できます。

http://www.cplusplus.com/reference/string/string/assign/

于 2011-01-14T13:45:04.677 に答える
2

このstd::stringコンストラクターを使用できます。

string ( const char * s, size_t n );

あなたの例では:

std::string str(u_array, 4);
于 2011-01-14T13:47:01.867 に答える
1

文字列自体にヌル文字が含まれていて、その後文字列を印刷しようとすると、まだ問題があります。

char c_array[4] = { 'a', 's', 'd', 0 };

std::string toto(array,4);
cout << toto << endl;  //outputs a 3 chars and a NULL char

でも....

cout << toto.c_str() << endl; //will only print 3 chars.

かわいらしさを捨ててベアCを使いたい時はこんな時。

于 2012-02-03T15:17:38.697 に答える
1

最初の文字を指す文字ポインターと、最後の 1 つ前の文字を指す別の文字ポインターを作成し、これら 2 つのポインターを反復子として使用して構築できます。したがって:

std::string str(&u_array[0], &u_array[0] + 4);
于 2011-01-14T13:45:09.900 に答える
0

試す:

std::string str;
str.resize(4);
std::copy(u_array, u_array+4, str.begin());
于 2011-01-14T13:46:29.847 に答える
0

std::string には、char の配列と長さを取るコンストラクターがあります。

unsigned char u_array[4] = { 'a', 's', 'd', 'f' };
std::string str(reinterpret_cast<char*>(u_array), sizeo(u_array));
于 2011-01-14T13:49:02.257 に答える
0

ええと、なぜキャストですか?

 std::string str(u_array, u_array + sizeof(u_array));

終わり。

于 2011-01-14T16:31:16.413 に答える