为什么没有使用C ++代码(strncpy_s)?

时间:2018-02-11 13:07:11

标签: c++ strncpy

我是C ++初学者。

当我学习C ++类时,这个示例代码不起作用。

此代码被NameCard类构造函数中的strncpy_s()func中断。

我试过调试,但我找不到原因。

你可以帮帮我吗? This is full source code

度过愉快的一天。

NameCard(char *name, char *phone, char *company, char *position)
{
    this->name = new char(strlen(name) + 1);
    this->phone = new char(strlen(phone) + 1);
    this->company = new char(strlen(company) + 1);
    this->position = new char(strlen(position) + 1);

    strncpy_s(this->name, strlen(name) + 1, name, strlen(name));
    strncpy_s(this->phone, strlen(phone) + 1, phone, strlen(phone));
    strncpy_s(this->company, strlen(company) + 1, company, strlen(company));
    strncpy_s(this->position, strlen(position) + 1, position, strlen(position));
}

2 个答案:

答案 0 :(得分:5)

您误用了new运算符。

所有行如:

new char(strlen(name) + 1);

应替换为:

new char[strlen(name) + 1];

new char(X)为一个char分配一个缓冲区,该缓冲区将填充ASCII码为X的字符。

new char[X]X个字符分配缓冲区;这就是你想要的。

但最好是首先使用std::string

答案 1 :(得分:3)

以下是我将如何为C ++ 17重新编写代码。

#include <cstddef>
#include <iostream>
#include <memory>
#include <string>

using std::cout;
using std::endl;
using std::move;
using std::ostream;
using std::string;

class NameCard;
ostream& operator<<(ostream&, NameCard const&);

class NameCard
{
private:
  string _name;
  string _phone;
  string _company;
  string _position;
public:
  NameCard(string name, string phone, string company, string position)
    : _name{move(name)}
    , _phone{move(phone)}
    , _company{move(company)}
    , _position{move(position)}
  {
  }

  NameCard(NameCard const& c)
    : _name{c._name}
    , _phone{c._phone}
    , _company{c._company}
    , _position{c._position}
  {
  }

  ~NameCard()
  {
  }

  void print(ostream& o) const
  {
    o << _name << " " << _phone << " " << _company << " " << _position;
  }
};

ostream& operator<<(ostream& o, NameCard const& c)
{
  c.print(o);
  return o;
}

int main()
{
  auto James = NameCard{"James", "11231123", "la", "manager"};
  cout << James << endl;
  auto James2 = James;
  cout << James2 << endl;
  return EXIT_SUCCESS;
}