strncpy_s с использованием компиляторов G ++

Первоначально я программировал назначение с использованием компиляторов Microsoft / visual c ++, но мой курс требует, чтобы я запускал и компилировал на Unix с использованием G ++

Однако strncpy_s не компилируется с использованием g ++, какой-либо обходной путь для моей конкретной программы?

Это фрагмент кода, который использует его:

void PhoneNumber::setName(const char name[])
{
strncpy_s(_name, name, MAX_NAME_LENGTH);
}

0

Решение

Вы не должны использовать strncpy или его _s версия, это может быть довольно удивительно в его поведении.

использование strlcpy вместо того, чтобы увидеть strlcpy и strlcat — согласованное, безопасное копирование и объединение строк.

-1

Другие решения

*_s Функции — это попытка Microsoft проявить смекалку и «защитить» строковые функции библиотеки времени выполнения C. Функции даже вошли в Приложение К. С99. Они не были реализованы в glibc Linux на момент написания этой статьи. Если вы абсолютно обязаны (и я советую против этого), просто правильно используйте обычные функции библиотеки C (это означает отсутствие магических чисел и надлежащих размеров буфера везде), и да, это боль в заднице.

Это может или не может быть использовано в контексте вашего назначения, но это действительно единственный правильный ответ:

class PhoneNumber
{
private:
std::string name;
// ...
public:
void setName(std::string name);
//...
};

void PhoneNumber::setName(std::string name)
{
this->name = std::move(name); // 'this->' is optional, but clarifies without resorting to some clever renaming of the variables
}

В качестве альтернативы, можно полностью удалить сеттер:

struct PhoneNumber
{
std::string name;
// ...
};

и назначить участника напрямую. Но этот стиль кодирования, хотя и совершенно нормальный, может заставить вас наорать на своего учителя.

Не используйте массивы C char в C ++. Вы будете стрелять себе в ногу без веской причины. Это также избавляет от магического числа в вашем коде, что всегда является плюсом.


Tiny C ++ 11 и более поздние шаблоны wankery. Идеальным решением для реализации установщика является использование шаблонов, так что потенциальное дорогостоящее двойное перемещение может быть предотвращено, если установщик называется setName(std::move(some_string)):

template<typename T>
void setName(T&& name) { this->name = std::forward<T>(name); }

Это позволит принять все, что можно назначить / переместить в std :: string, что на самом деле очень удобно. В качестве дополнительного преимущества вы получаете наилучший возможный путь кода, выбранный для вас автоматически. Конечно, для вашего задания это будет огромным излишним, но если вы потратите время на изучение этих понятий, вы можете просто научить учителя чему-то. Опять же, предпочитаю public участник этого шаблона … wankery, потому что это то, что это.

7

По вопросам рекламы [email protected]