-2

我正在编程一个锁,在哪里解锁它你必须在键盘中插入一个 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()函数逐个字符地比较两个字符串,所以有人能解释一下为什么我必须以否定的方式使用它,而不是初始密码和用户在键盘匹配中按下的密码吗?

4

2 回答 2

5

strncmp()当两个字符串相同时,函数返回零,当它们不同时返回非零。

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

于 2020-12-11T15:32:41.737 回答
3

int strncmp(const char *s1, const char *s2, size_t n);不仅比较相等,它还检查顺序。所以它至少需要3 个不同的返回值。

strncmp函数返回一个大于、等于或小于零的整数,相应地,因为 指向的可能以空结尾的数组s1大于、等于或小于 指向的可能以空结尾的数组s2。C17dr § 7.24.4.4 3

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

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


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

if (strncmp(password, password_init, 4) == 0) {
于 2020-12-11T17:09:37.413 回答