Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 转换为char*c+后丢失字符串数据+;_C++_String_Type Conversion - Fatal编程技术网

C++ 转换为char*c+后丢失字符串数据+;

C++ 转换为char*c+后丢失字符串数据+;,c++,string,type-conversion,C++,String,Type Conversion,我目前正在学习如何使用libcurl开发HTTP代理。成功获得HTTP响应后,我将它们写入字符串,然后再使用回调函数进行进一步处理。在进一步的处理函数中,我首先需要将这些字符串转换为char*,这导致了一个丢失数据的问题,因为这些HTTP响应包含png和gif等图像数据。而其余的HTTP响应包含纯文本数据,如HTML和css,工作正常 我的问题是,为什么c_str()函数在转换过程中消除了像图像数据这样的不可读数据?有没有办法解决这个丢失数据的问题 代码: 字符*数据源 void Client:

我目前正在学习如何使用libcurl开发HTTP代理。成功获得HTTP响应后,我将它们写入字符串,然后再使用回调函数进行进一步处理。在进一步的处理函数中,我首先需要将这些字符串转换为char*,这导致了一个丢失数据的问题,因为这些HTTP响应包含png和gif等图像数据。而其余的HTTP响应包含纯文本数据,如HTML和css,工作正常

我的问题是,为什么c_str()函数在转换过程中消除了像图像数据这样的不可读数据?有没有办法解决这个丢失数据的问题

代码: 字符*数据源

void Client::send(string msg)
{
   sData_source_ = (char*)msg.c_str();
   cout << "Your string is " << strlen(sData_source_)<<endl; 
}
void客户端::发送(字符串消息)
{
sData_source_u=(char*)msg.c_str();

cout看起来您正试图将二进制文件视为字符串

<> >一旦遇到<代码> 0代码>代码>终止符,字符串将结束。请考虑以下内容:

const char* foo = "abc\012345667";
int length = strlen(foo);

长度
3
,因为原始字符串在3个字符后被终止。

以下是我修改代码后的解决方案,只想与将来可能处理相同问题的其他人分享

 size_t SData_length; 

 void Client::send(string msg)
 {
    sData_length = msg.size(); 

    // allocate memory for sData_source
    sData_source_ = (char*)malloc(sData_length);

    // copy data to sData_source
    memcpy(sData_source_, msg.data(), sData_length); 

    // compare data after copy
   if(memcmp(sData_source_, msg.data(), sData_length) == 0)
   {
    cout<<"Copy Data Succeed"<<endl;
   }
}
大小数据长度;
无效客户端::发送(字符串消息)
{
sData_length=msg.size();
//为sData_源分配内存
sData_源=(字符*)malloc(sData_长度);
//将数据复制到sData_源
memcpy(sData_源,msg.data(),sData_长度);
//复制后比较数据
if(memcmp(sData\u源,msg.data(),sData\u长度)==0)
{

像gif和png这样的图像数据可以包含
0
作为数据,而
strlen
将其视为字符串的结尾
null
终止符。你不应该依赖
strlen()
来实现这一点,而应该单独跟踪数据字节。你显式转换为
char*
是没有用的,
c_str()
返回一个
常量字符*
。除此之外,我正在投票,因为我非常好奇这个问题的答案。正如@Als提到的,你不能依赖strlen(),而不是使用
msg
字符串的
size
方法;此方法必须返回正确的大小;另一方面,如果您使用的是原始数据而不是字符。一个潜在的更大问题是,您正在存储指向本地对象的指针,当函数返回时,该指针将被销毁。您需要确保字符串在
sData\u source\uuuu
的任何使用中都不会过期(或者将其更改为
std::string
,或者重新构造代码以避免静态存储)。多亏了你们的注释,我解决了这个问题。是的,审美家。你的路线是正确的。因为我有时处理原始数据而不是字符,所以我需要使用数据()方法,而不是PaperBirdMaster在上述注释中提到的c_str()。