簡體   English   中英

將非null終止的unsigned char數組復制到std :: string

[英]Copying non null-terminated unsigned char array to std::string

如果數組是以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數組的情況下做到這一點?

謝謝你們。

std::string有一個構造函數 ,它接受一對迭代器, unsigned char可以轉換(以實現定義的方式)為char這樣就可以了。 不需要reinterpret_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計算。

好吧,顯然std :: string有一個可以在這種情況下使用的構造函數

std::string str(reinterpret_cast<char*>(u_array), 4);

在構造字符串而不指定其大小時,構造函數將遍歷一個字符數組並查找null-terminator,即'\\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;
}

std :: string有一個名為assign的方法。 您可以使用char *和大小。

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

你可以使用這個std::string構造函數:

string ( const char * s, size_t n );

所以在你的例子中:

std::string str(u_array, 4);

這應該這樣做:

std::string s(u_array, u_array+sizeof(u_array)/sizeof(u_array[0]));

當字符串本身包含空字符並且您嘗試隨后打印字符串時仍然存在問題:

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.

您可以創建指向第一個字符的字符指針,另一個指向最后一個字符,並使用這兩個指針作為迭代器進行構造。 從而:

std::string str(&u_array[0], &u_array[0] + 4);

嘗試:

std::string str;
str.resize(4);
std::copy(u_array, u_array+4, str.begin());

std :: string有一個構造函數,它接受一個char數組和一個length。

unsigned char u_array[4] = { 'a', 's', 'd', 'f' };
std::string str(reinterpret_cast<char*>(u_array), sizeo(u_array));

呃,演員為什么?

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

完成。

雖然問題是如何“將非空終止的unsigned char數組[...]復制到std::string ”,但我注意到在給定的示例中,該字符串僅用作std::cout的輸入。

在這種情況下,當然你可以完全避免字符串而只是這樣做

std::cout.write(u_array, sizeof u_array);
std::cout << std::endl;

我認為可以解決OP 試圖解決的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM