【问题标题】:strncmp() function vs !(strncmp()) functionstrncmp() 函数与 !(strncmp()) 函数
【发布时间】:2020-12-11 15:29:16
【问题描述】:

我正在编程一个锁,你必须在键盘中插入一个 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

标签: c arduino strncmp


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    strncmp 函数返回一个大于、等于或小于零的整数,因此s1 指向的可能以 null 结尾的数组大于、等于或小于可能的 null- 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) {
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 2011-07-14
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多