Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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++ - Fatal编程技术网

C++ 如何将char*转换为字符串?

C++ 如何将char*转换为字符串?,c++,C++,当我将char*转换为字符串时,在“new.cpp”中会出现错误的内存分配错误。我使用以下方法将名为“strData”和“strOrg”的char*转换为字符串 const char* strData = dt.data(); int length2 = dt.length(); string s1(strData); 第一次它工作没有任何问题。但在第二次转换中,它给出了上述误差。当我按顺序交换这两个转换时,无论我转换的字符是什么,它总是在第二个转换中给出错误。整个代码如下所

当我将char*转换为字符串时,在“new.cpp”中会出现错误的内存分配错误。我使用以下方法将名为“strData”和“strOrg”的char*转换为字符串

   const char* strData = dt.data();
   int length2 = dt.length();
   string s1(strData);
第一次它工作没有任何问题。但在第二次转换中,它给出了上述误差。当我按顺序交换这两个转换时,无论我转换的字符是什么,它总是在第二个转换中给出错误。整个代码如下所示

    mysqlpp::Query query = conn.query("SELECT data,origin from image where id =2");
    mysqlpp::UseQueryResult res = query.use();
    mysqlpp::Row eee= res.fetch_row();
    mysqlpp::Row::reference dt = eee.at(0);
    mysqlpp::Row::reference org = eee.at(1);

    const char* strData = dt.data();
    int length2 = dt.length();
    string s1(strData);
    istringstream is1(s1);  
    char * imgData =  new char;
    is1.read(reinterpret_cast<char *> (imgData), length2);
    delete [] strData;

    const char* strOrg = org.data();
    int length3 = org.length();
    string s2(strOrg);
    istringstream is2(s2);  
    char * imgOrg =  new char;
    is2.read(reinterpret_cast<char *> (imgOrg), length3);
    delete [] strOrg;
如何解决此问题?

而不是

char * imgData = new char;
is1.read(reinterpret_cast<char *> (imgData), length2);
char*imgData=新字符;
is1.读取(重新解释铸件(imgData),长度2);
试一试

char*imgData=新字符[长度2];
is1.读取(重新解释铸件(imgData),长度2);
当您使用
read
istringstream
读取数据时,您提供的缓冲区必须有足够的空间来保存结果

如果调用
newchar
您可以为一个
char
获得空间。使用
新字符[n]以获取n.

的空间,而不是

char * imgData = new char;
is1.read(reinterpret_cast<char *> (imgData), length2);



    delete [] strData;

char*imgData=新字符;
is1.读取(重新解释铸件(imgData),长度2);
试一试

char*imgData=新字符[长度2];
is1.读取(重新解释铸件(imgData),长度2);
当您使用
read
istringstream
读取数据时,您提供的缓冲区必须有足够的空间来保存结果

如果调用
newchar
您可以为一个
char
获得空间。使用
新字符[n]以获取n的空间




    delete [] strData;

这很糟糕。上面这条线可能也是,但我知道这条是

您正在删除dt.data()。如果我没记错的话,这肯定是字符串的内部缓冲区

这可能是您的根本问题,也可能不是,正如我所说的,我怀疑上面的那一行也不好,因为您将指向单个字符的指针传递给了看起来需要一定长度的缓冲区

这很糟糕。上面这条线可能也是,但我知道这条是

您正在删除dt.data()。如果我没记错的话,这肯定是字符串的内部缓冲区

这可能是您的根本问题,也可能不是。正如我所说,我怀疑上面的那行也不好,因为您传入了一个指向单个字符的指针,指向似乎需要一定长度的缓冲区。

我相信问题(或至少部分问题)在于您的分配:

char * imgData =  new char;
这只分配1个字符,然后
istream.read
将假定imgData是一个字符缓冲区(注意复数形式),并将它读取的内容放入分配的单个字符中,然后再放入谁知道是什么使用的内存中

结果通常被称为“未定义的行为”-有时你会像第一次那样侥幸逃脱,有时你不会,就像第二次转换一样。

我相信问题(或至少部分问题)在于你的分配:

char * imgData =  new char;
这只分配1个字符,然后
istream.read
将假定imgData是一个字符缓冲区(注意复数形式),并将它读取的内容放入分配的单个字符中,然后再放入谁知道是什么使用的内存中


结果通常被称为“未定义的行为”-有时你会像第一次转换那样侥幸逃脱,有时你不会,就像第二次转换一样。

你是否尝试过在调试器中单步执行以查看发生了什么?你能澄清一下你的目标是什么吗?您当前的代码充满了答案中提到的各种错误。如果您需要将数据从MySql查询转换为std::string,请看一下您是否尝试过在调试器中单步执行以查看发生了什么?您能否澄清您的目标是什么?您当前的代码充满了答案中提到的各种错误。如果需要将数据从MySql查询转换为std::string,请查看