Я программирую замок, чтобы открыть его, нужно ввести PIN-код на клавиатуре. У меня есть следующие переменные:
char password_init[4] = {'1', '2', '3', '4'}; //initial password
char password[4];
Когда пользователь нажимает клавишу на клавиатуре, эта цифра будет сохранена в переменной password
, и после того, как пользователь нажмет 4 цифры, обе переменные будут сравниваться, чтобы дать или не дать доступ к замку.
Я обнаружил, что одним из решений для этого будет использование функции strncmp() как:
if (!(strncmp(password, password_init, 4))){
Serial.println("PIN Code correct");
}
Это работает, но я не понимаю, почему я должен использовать !(strncmo())
вместо strncmo()
.
Если я использую if (strncmp(password, password_init, 4))
, результатом будет неправильный PIN-код.
Функция strncmp()
сравнивает две строки, символ за символом, поэтому может ли кто-нибудь объяснить мне, почему я должен использовать ее отрицательным образом, а не начальный пароль и пароль, набранный пользователем на клавиатуре, совпадают?
Функция strncmp() возвращает ноль, когда две строки одинаковы, и ненулевое значение, когда они различны.
При использовании оператора !
(логическое НЕ) результат будет истинным (1), если строки одинаковы, и ложным (0), если они разные.
int strncmp(const char *s1, const char *s2, size_t n);
не только сравнивает на равенство, но и проверяет на порядок. Поэтому ему нужно как минимум 3 разных возвращаемых значения.
Функция
strncmp
возвращает целое число, большее, равное или меньшее нуля, соответственно, поскольку массив с возможным нулевым завершением, на который указываетs1
, больше, равен или меньше возможного массива с нулевым завершением, на который указываетs2
. C17dr § 7.24.4.4 3
int
: s1
"больше" s2
int
: s1
"меньше" s2
s1
"равно" s2
!(strncmp(password, password_init, 4))
подразумевает, что они равны (до первых 4 символов строк).
Я считаю, что нижеследующее легче читать как тест на равенство строк.
if (strncmp(password, password_init, 4) == 0) {
Некоторые люди пишут
if (strncmp(...) == 0)
. Есть много функций, которые возвращают0
в случае успеха, поэтому глаза привыкают видеть== 0
.