0

我正在尝试getpass(),我想我会尝试一些东西:

char *key1 = getpass("K: ");
char *key2 = getpass("K: ");
if(key1 == key2) {

    printf("Good\n");

} else {

    printf("Bad\n");

}

如果我在两个不同的领域写两个不同的东西,它会说“好”。我添加了一行来打印这两个字符串,结果证明它们都等于我在第二个字符串中键入的任何内容(为 key1 和 key2 键入“1”和“2”将导致两者都等于 2)。这里会发生什么?

4

2 回答 2

2

从 Linux 手册页中,getpass()返回一个指向静态缓冲区的指针,因此每次调用 get pass 都将返回相同的地址,并且存储在中的指针key1将始终等于存储在key2.

返回值

该函数getpass()返回一个指向静态缓冲区的指针,该缓冲区包含密码(第一个 PASS_MAX 字节),没有尾随换行符,以空字节 ('\0') 终止。该缓冲区可能会被后续调用覆盖。出错时,将恢复终端状态,errno进行适当设置,并返回 NULL。

您需要为getpass()can 返回的每个字符串创建一个本地副本,然后使用它(strcmp(key1Copy, key2Copy) == 0)来查看它们是否相等。

于 2013-11-12T05:43:04.647 回答
0

用于strdup()复制“字符串”并按strcmp()内容比较两个“字符串”。

尝试这个:

char * key1 = strdup(getpass("K: ")); 
char * key2 = strdup(getpass("K: ")); 

if (0 == strcmp(key1, key2)) 
{
  printf("Good\n");
}
else
{
  printf("Bad\n");
}

free(key1);
free(key2);

另请注意getpass() 已过时不再使用!

于 2013-11-12T11:27:32.977 回答