当2个字符串相等时,strcmp返回1,为什么?

时间:2014-11-17 04:17:45

标签: c string strcmp

我有以下代码。我是从http://www.gnu.org/software/libc/manual/html_node/crypt.html

取的
#define _XOPEN_SOURCE
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <crypt.h>

int
main(void)
{
  /* Hashed form of "GNU libc manual". */
  const char *const pass = "$1$/iSaq7rB$EoUw5jJPPvAPECNaaWzMK/";

  char *result;
  int ok;

  printf("%s\n",pass);

  /* Read in the user’s password and encrypt it,                                                                                                    
     passing the expected password in as the salt. */
  result = crypt(getpass("Password:"), pass);

  printf("%s\n",result); /*I added this printf*/
  /* Test the result. */
  ok = strcmp (result, pass) == 0;
  printf("valor de la comparacion: %i\n",ok);/*I added it*/
  puts(ok ? "Access granted." : "Access denied.");
  return ok ? 0 : 1;
}

当我键入GNU libc手册时,输出为“Acces granted”。但是strcmp返回的值是1,这个值意味着结果和传递不相等。但是输出是:

$1$/iSaq7rB$EoUw5jJPPvAPECNaaWzMK/
Password:
$1$/iSaq7rB$EoUw5jJPPvAPECNaaWzMK/
valor de la comparacion: 1
Access granted.

我对strcmp的行为非常困惑。

3 个答案:

答案 0 :(得分:4)

您正在打印ok

的值

在这一行:

ok = strcmp (result, pass) == 0;

它将strcmp的返回值与0进行比较。它们是平等的,所以比较是正确的。这会将ok设置为1。将整数设置为布尔比较的结果,1表示true,0表示false。

答案 1 :(得分:2)

  

但是strcmp返回的值是1,这个值意味着结果和传递不相等

你错了。在c中,值1与true同义,false为0。

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("%i\n", 1 == 2);
    printf("%i\n", 1 == 1);
}

输出

0
1

答案 2 :(得分:1)

赋值运算符=的优先级低于关系运算符==。因此,ok = strcmp (result, pass) == 0;语句等同于ok = (strcmp (result, pass) == 0);。您将结果strcmp分配给ok,但结果为strcmp (result, pass) == 0