2013-03-04 96 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);