strncmp() 函数与 !(strncmp()) 函数

strncmp() function vs !(strncmp()) function

我正在编写一把锁,您必须在键盘中输入 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() 函数 returns 两个字符串相同时为零,不同时为非零。

使用!(逻辑非)运算符,当字符串相同时结果为真(1),当它们不同时结果为假(0)。

int strncmp(const char *s1, const char *s2, size_t n); 不仅比较 equality,它还检查 order。所以它至少需要 3 个不同的 return 值。

The strncmp function returns an integer greater than, equal to, or less than zero, accordingly as the possibly null-terminated array pointed to by s1 is greater than, equal to, or less than the possibly null-terminated array pointed to by s2. C17dr § 7.24.4.4 3

  • Return 一些积极的 ints1 是“大于”s2
  • Return 一些负数 int: s1 是“小于” s2
  • Return 0:s1“等于”s2

!(strncmp(password, password_init, 4)) 表示它们相等(直到字符串的前 4 个字符)。


我发现下面的字符串相等性测试更容易阅读。

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