Функция strncmp() и функция !(strncmp())

Я программирую замок, чтобы открыть его, нужно ввести 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() сравнивает две строки, символ за символом, поэтому может ли кто-нибудь объяснить мне, почему я должен использовать ее отрицательным образом, а не начальный пароль и пароль, набранный пользователем на клавиатуре, совпадают?

Некоторые люди пишут if (strncmp(...) == 0). Есть много функций, которые возвращают 0 в случае успеха, поэтому глаза привыкают видеть == 0.

KamilCuk 11.12.2020 16:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
422
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Функция 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
  • Возврат 0: s1 "равно" s2

!(strncmp(password, password_init, 4)) подразумевает, что они равны (до первых 4 символов строк).


Я считаю, что нижеследующее легче читать как тест на равенство строк.

if (strncmp(password, password_init, 4) == 0) {

Другие вопросы по теме