【发布时间】:2021-06-30 05:22:32
【问题描述】:
所以,我遇到了以下代码的问题,std::cout << cstr << std::endl 的结果是单个字符
PyObject * CKKSwrapper::SerializeContext() {
std::string s; // 1
std::ostringstream os(s); // 2
Serial::Serialize(m_cc, os, SerType::BINARY); // 3
const std::string string_repr = os.str(); // 4
std::cout << string_repr << std::endl; // 5
char *cstr = new char[string_repr.length() + 1]; // 6
std::strcpy(cstr, string_repr.c_str()); // 7
std::cout << "******************************************************" << std::endl; // 8
std::cout << string_repr << std::endl; // 9
std::cout << "******************************************************" << std::endl; // 10
std::cout << cstr << std::endl; // 11
auto resp = PyBytes_FromString(cstr); // 12
return resp;
}
检查第 5 行的 std::cout 结果看起来不错,并且不是空的。
@ � �4 lbcrypto::LPCryptoParametersCKKSlbcrypto::DCRTPoly �@ �
^ 前几个字符(不确定是否有帮助)
稍后,我创建了一个 char 数组并将 c_str 复制到其中(我认为)避免了 https://stackoverflow.com/a/39006531/3532564 中讨论的临时结果问题
不要试图存储 c_str() 返回的指针。如果您需要将该字符串作为 C 字符串长时间使用,请自行为其分配内存缓冲区并将 c_str() 的结果复制到该缓冲区。
我还发现了https://stackoverflow.com/a/35981001/3532564,这让我想知道我的string_repr 对象是否被破坏了,所以我在第 9 行做了一个 std::cout,它看起来也不错。
谁能帮帮我?我真的不确定问题出在哪里。不幸的是,我需要将char * [] 传递给PyBytes_FromString,尽管这个名字可能会让人想到
【问题讨论】:
-
你知道
strcpy()是如何知道需要复制多少个字符的吗?找到这个问题的答案后,看看string_repr中的第二个字符是什么,然后你应该就能自己弄清楚了! -
这很可能是由 NUL 引起的,正如之前的评论者所建议的那样。尝试改用
PyBytes_FromStringAndSize。同样,您不需要自己复制字符串,因为 PyBytes 会自行复制。