函数返回指针和来自未知DLL的长度(通过参数)。
Result = SpamnEggs( &pBytes, &nBytes )
指针指向有效的内存地址,该地址是nBytes连续字节。 这些字节包含文本的有效ascci值。没有空终止!
我的任务是" ovelaying"在输出之前,在通用C ++代码(没有复杂库或使用字节)中的少数简单操作中的某种字符串类型:
cout << sresult
添加了: 不复制字节,因为这是一个必须遍历的大缓冲区。
原型:
int SpamnEggs( void* pBytes, void* nBytes );
becomes
int SpamnEggs( char** pBytes, int* nBytes );
非常感谢大家。很棒的答案,非常有效。
答案 0 :(得分:2)
您可以复制原始内存并自行添加字符串终止字符:
char* newStr = new char[size + 1];
memcpy ( newStr, source, size );
newStr[size] = "\0";
cout << newStr;
如果不复制内存,您可以创建一个将指针和长度保存为成员的类,并使流操作符重载以仅打印length
个字符:
class MyString
{
void* _pBuf;
int _length;
public:
MyString(void* pBuf, int length)
{
_pBuf = pBuf;
_length = length;
}
friend ostream& operator <<(ostream &os,const MyString& obj);
};
ostream& operator <<(ostream &os,const MyString& obj)
{
const char* pChar = (const char*)obj._pBuf;
for ( int i = 0 ; i < obj._length ; i++ )
{
os << pChar[i];
}
return os;
}
使用示例:
char* x = "blablabla";
int length = 3;
MyString str(x,length);
cout << str;
答案 1 :(得分:2)
你可以从指针和长度构造一个std :: string。
std::string sResult(pBytes, nBytes);
std::cout << sResult;
(假设pBytes
是char*
指针,否则你需要一个小演员。)
答案 2 :(得分:1)
你需要做的是
a)创建一个封装char指针和大小的类。
b)写一个&lt;&lt;该类的运算符,用于将其内容输出到流中。
编辑:与Bo Persson的回应相反,这并不意味着复制源数据。
答案 3 :(得分:1)
这样的事情(未经测试的)如何:
class my_pointer_string
{
friend std::ostream &operator<<(std::ostream &, const my_pointer_string &);
public:
my_pointer_string(void *ptr, size_t len)
: m_pointer(ptr), m_length(len)
{ }
private:
void *m_pointer;
size_t m_length;
};
std::ostream &operator<<(std::ostream &os, const my_pointer_string &str)
{
char *string = reinterpret_cast<char *>(str.m_pointer);
for (size_t i = 0; i < str.m_length; i++)
os << *string++;
return os;
}