getpass()设置两个相同的字符串?

时间:2013-11-12 05:39:04

标签: c

我正在尝试getpass(),我想我会尝试一下:

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

    printf("Good\n");

} else {

    printf("Bad\n");

}

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

2 个答案:

答案 0 :(得分:2)

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

  

返回值

     

函数getpass()返回一个指向静态缓冲区的指针,该缓冲区包含(没有尾随换行符的密码的第一个PASS_MAX字节),以空字节('\ 0')结束。可以通过以下调用覆盖此缓冲区。发生错误时,将恢复终端状态,正确设置errno,并返回NULL。

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

答案 1 :(得分: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() 已过时将再次使用!