[英]How to convert my string into array of chars
这是一个问题。 当我尝试使用 strncpy_s 对其进行转换时,数组末尾有来自 memory 的某种“垃圾数据”。 即使我用“\ 0”填充缓冲区。 怎么转换清楚?
typedef class Ryadok {
private:
int LengthOf = 0;
char text[20];
string* address;
public:
Ryadok(string strin) {
this->text[0] = '\0';
memset(text, '\0', sizeof(text));
strncpy_s(text, strin.c_str(), sizeof(text) - 1);
this->address = &strin;
for (int i = 0; i < sizeof(strin); i++) {
cout << this->text[i];
}
}
~Ryadok() {
}
}*cPtr;
int main()
{
Ryadok example("sdsdfsdf");
}
使用strncpy_s
function 时,您告诉它复制尽可能多的字符以适合您的缓冲区"text"
。 由于您创建"example"
实例所用的字符串较短,因此副本 function 将在实际字符串结束后继续。
那就是你的垃圾来自哪里。 更糟糕的是,您以这种方式冒着分段错误的风险。 您的代码可能会访问不允许读取的 RAM 部分。 这将导致它崩溃。
尽管复制c_str()
返回指向的数据是正确的。 c_str()
返回的指针指向属于 std::string object 的数据,并且可能会被该 object 更改甚至失效。 (在这里阅读更多)
这是您的代码的修改版本,应该避免垃圾:
typedef class Ryadok {
private:
int LengthOf = 0;
char text[20];
string* address;
public:
Ryadok(string strin) {
this->text[0] = '\0';
memset(text, '\0', sizeof(text));
if(strin.length()+1 <= sizeof(text)) {
strncpy_s(text, strin.c_str(), strin.length()+1);
} else {
//some error handling needed since our buffer is too small
}
this->address = &strin;
for (int i = 0; i < sizeof(strin); i++) {
cout << this->text[i];
}
}
~Ryadok() {
}
}*cPtr;
int main()
{
Ryadok example("sdsdfsdf");
}
使用 c_str() function 将 std::string 转换为 a-string 的想法。 然后我们可以简单地调用 strcpy() function 将 c-string 转换为 char 数组
std::string s = "Hello World!";
char cstr[s.size() + 1];
strcpy(cstr, s.c_str()); // or pass &s[0]
std::cout << cstr << '\n';
return 0;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.