【问题标题】:Am I using strcpy_s incorrectly?我是否错误地使用了 strcpy_s?
【发布时间】:2013-10-30 19:17:51
【问题描述】:

我有一个名为“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 错误或其他东西,因为当我在 main 中测试我的构造函数时:

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

这会打印到我的控制台:

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

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

编辑:我的 printOn 方法

/*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; 
} 

【问题讨论】:

  • 使用std::stringchar* 的所有问题都已解决。
  • 你试过调试器吗?
  • 我有,只是复制姓名和email的首字母,所以只应对S和i
  • 函数 printOn(cout); 的作用是什么?做什么?

标签: c++ constructor strcpy


【解决方案1】:

不清楚 printOn(cout); 是什么函数在你的构造函数中。难道是它的输出?

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

【讨论】:

  • 好电话,我注释掉了 printOn(cout) 行,它消失了。
  • “不需要使用strcpy_s”?我同意的唯一方法是如果建议是使用std::string 而不是使用strcpy
  • @crashmstr - 当代码刚刚分配了一个大小合适的缓冲区时,使用strcpy_s 毫无意义。编写正确的代码不是应用简单的公式,而是思考代码在做什么。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多