Как не вызывать функцию типа char при ёё присваивании в переменную типа char
strcpy_s(inputOperator,strlen(ChooseOperator())+1,ChooseOperator());
Когда я выполняю этот код у меня функция ChooseOperator() вызывается 2 раза
inputOperator - char inputOperator[32];
Вопрос:как этого избежать
Ответы (1 шт):
Правильный код такой:
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);