C++ 我是否使用strcpy_不正确?

C++ 我是否使用strcpy_不正确?,c++,constructor,strcpy,C++,Constructor,Strcpy,我有一个名为“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

我有一个名为“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);
    }
我认为这里有一个off-by-1错误,因为当我在main中这样测试我的构造函数时:

Person *p1 = new Person("Sarah", "iam@awesome.com", 2,2,1000);
这将打印到我的控制台:

Person(...) FIRST CONSTRUCTOR CREATING: Sarah
ààà
我不明白为什么构造器运行后会打印a。。。有人能看到这个问题吗

编辑:我的printOn方法

/*print person on output stream o*/
    virtual void printOn(ostream & o) const { 
        //print person
         o << "………";
    } 
/*在输出流上打印人员o*/
虚空打印(ostream&o)常量{
//印刷人

不清楚printOn(cout);在构造函数中是做什么的。这可能是它的输出吗


至于strcpy函数,则无需使用它。最好使用旧函数strcpy。在代码中,您调用strlen两次:一次是在分配内存时,第二次是在使用strcpy时。您的输出使用的文本编码与编辑器不同。显示为
在您的代码编辑器中,当您将其打印出来时,它将变成
a


一般来说,除非你知道如何选择正确的编码,否则不要使用高ASCII字符,否则事情不会按照你的想法进行。

使用
std::string
char*
的所有问题都已解决。你试过调试程序了吗?我试过,它只是复制了姓名和电子邮件的第一个字母,所以它只能处理s和I的问题es函数printOn(cout);do?很好的调用,我注释掉printOn(cout)行,它就消失了。“不需要使用strcpy
”我同意的唯一方法是,如果建议使用
std::string
而不是使用
strcpy
@crashmstr-当代码刚刚分配了一个大小合适的缓冲区时,使用
strcpy\u s
是毫无意义的。编写正确的代码不是应用简单的公式,而是考虑使用什么e代码正在执行。
/*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; 
}