繁体   English   中英

如何将我的字符串转换为字符数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM