Как не вызывать функцию типа char при ёё присваивании в переменную типа char

strcpy_s(inputOperator,strlen(ChooseOperator())+1,ChooseOperator());  

Когда я выполняю этот код у меня функция ChooseOperator() вызывается 2 раза
inputOperator - char inputOperator[32];
Вопрос:как этого избежать


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Правильный код такой:

strcpy_s(inputOperator, ::std::size(inputOperator), ChooseOperator());

Из документации про второй параметр strcpy_s:

destsz - maximum number of characters to write, typically the size of the destination buffer

Идея в том чтобы первые два параметра на зависили от строки которую мы копируем. Сравните:

strcpy_s(dst, sizeof(src), src);      // 1
strcpy_s(dst, strlen(src) + 1, src);  // 2

strcpy_s(dst, sizeof(dst), src);      // 3

Если в первом и вторых вариантах src слишком велик, вы пишете в память за концом dst. Возникает неопределённое поведение. Программа продолжает работу, что опасно.

Напротив, в третьем варианте, функция обнаружит ошибку и прервёт программу, чтобы предотвратить распространение ошибки. Также будут перехвачены многие другие ошибки.

Не пользуйтесь первым и вторым способми, вы теряете возможность обнаружить ошибку.

P.S. Для полноты как можно было бы поправить ваш код:

const char *op = ChooseOperator();
strcpy_s(inputOperator, strlen(op) + 1, op);
→ Ссылка