我是否使用不正确strcpy_s

Am I using strcpy_s incorrectly?

本文关键字:strcpy 不正确 是否      更新时间:2023-10-16

我有一个名为"Person"的Person类的构造函数,它看起来像这样:

    Person(const char * their_name, const char * email, int day, int month, int year)
        : name(0), email_address(0), birthday(day, month, year) {
        name = new char [strlen(their_name)+1];
        strcpy_s(name, strlen(their_name) +1, their_name);
        email_address = new char[strlen(email) + 1]; 
        strcpy_s(email_address, strlen(email) + 1, email); 
        cout << "nPerson(...) FIRST CONSTRUCTOR CREATING: "<<name<<"n";
        printOn(cout);
    }

我在此类中有私有变量:

private: 
    char * name; 
    char * email_address; 
    Date birthday; 

我认为这里有一个 off by 1 错误或其他东西,因为当我像这样测试我的构造函数时:

Person *p1 = new Person("Sarah", "iam@awesome.com", 2,2,1000);

这将打印到我的控制台:

Person(...) FIRST CONSTRUCTOR CREATING: Sarah
ààà

我不明白为什么它在构造函数运行后打印 a...任何人都可以看到问题吗?

编辑:我的打印方法。

/*print person on output stream o*/
    virtual void printOn(ostream & o) const { 
        //print person
         o << "………";
    } 

和覆盖的<<运算符

ostream & operator<<(ostream & ostr, const Person & p) { 
    p.printOn(ostr); 
    return ostr; 
} 

目前尚不清楚 printOn(cout) 函数在构造函数中做什么。难道是它的输出吗?

至于功能strcpy_s则无需使用它。使用旧的函数 strcpy 会好得多。在代码中,您调用 strlen 两次:一次是在分配内存时,第二次是在使用 strcpy_s 时。

您的输出使用的文本编码与编辑器不同。在代码编辑器中显示为的字符在打印出来时会变为à

一般来说,除非您知道如何选择正确的编码,否则不要使用高 ASCII 字符,否则事情不会像您想象的那样工作。