2013-03-04 84 views
0

所以給出:輸出的char *到的std :: string C++

struct MemoryStruct { 
    char *memory; 
    size_t size; 
}; 

char* memory持有捲曲的回報,XML文檔。

我做:

if(chunk.memory) { 
    std::cout << "char size is " << sizeof(chunk.memory) << std::endl; 
    std::string s = ""; 
    for (int c = 0; c<sizeof(chunk.memory); c++) { 
     s.push_back(chunk.memory[c]); 
    } 
    std::cout << "s: " << s.c_str() << std::endl; 
} 

我只取回<?xm

所以sizeof(),我認爲是在炭返回的總字節數*

我如何得到什麼實際的價值是char*。所以基本上整個捲曲都會返回。哪5行是XML?

+2

'sizeof'在'字符*'將返回指針的大小,該字符串中的字符數量不限。使用'strlen(chunk.memory)'獲取字符串長度(假設它以null結尾)。並且不需要單獨push_back每個字符,'std :: string'有一個構造函數,它接受'char const *'到一個以空字符結尾的字符串。 'std :: string s(chunk.memory);'就足夠了。如果不是空終止,請使用's(chunk.memory,str_length);' – Praetorian 2013-03-04 18:18:14

回答

4

sizeof(chunk.memory)將總是給你一個指針的大小,你的情況似乎是4.這就是爲什麼你在std :: string中只能看到4個字符。

如果捲曲返回或任何其他由\0終止,那麼你就可以直接做以下

std::string s(chunk.memory); 

如果您的char *不被\0終止,那麼你需要知道字符串的長度 - 您無法使用sizeof(chunk.memory)。如果您chunk.size包含正確的大小,那麼你可以使用

std::string s(chunk.memory, chunk.size); 
+1

你可能想建議'strlen(chunk.memory)'? – hannes 2013-03-04 18:18:58

+0

另外,如果'MemoryStruct'是由他的代碼創建的,那麼他可以在第一個地方使用'std :: string'。 – 2013-03-04 18:22:09

+0

其實你可能不想使用strlen,因爲xml解析器正在返回一個不會被空終止的小內存塊。 – doron 2013-03-04 18:56:33

2

的std :: string構造函數可以接受的char *和數據長度(see the docs);例如:

std::string s(chunk.memory, chunk.size); 

所以容器會預先爲您的字符串分配需要的空間並用它進行初始化。

2

MemoryStructmemory是指向第一個返回字符的指針,而size是返回的字符數。要初始化字符串與此數據,所以你需要做的:

s.assign(chunk.memory, chunk.size);