我有以下代码。我是从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的行为非常困惑。
答案 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
。