2013-11-12 2 views
0

Я испытываю getpass(), и я думал, что я хотел бы попробовать что-то:getpass() устанавливает две строки одинаковые?

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

    printf("Good\n"); 

} else { 

    printf("Bad\n"); 

} 

Если я пишу две разные вещи в двух различных областях, он будет говорить «Хорошо». Я добавил строку для печати двух строк, и оказалось, что они оба равны тому, что я набираю во втором (ввод «1» и «2» для key1 и key2 приведет к тому, что оба будут равны 2). Что здесь может быть?

ответ

2

Со страниц человека Linux, getpass() возвращает указатель на статический буфер, так что каждый вызов, чтобы получить пропуск будет возвращать один и тот же адрес и указатель, хранящийся в key1 будет всегда равно указатель, хранящийся в key2.

Возвращаемого значение

getpass() Функция возвращает указатель на статический буфер, содержащий (первые PASS_MAX байты) пароль без символа новой строки, завершающей, заканчивающийся нулевым байтом («\ 0»). Этот буфер может быть перезаписан следующим вызовом. При ошибке состояние терминала восстанавливается, errno устанавливается соответствующим образом, и возвращается NULL.

Вам нужно будет сделать локальную копию каждой строки, возвращаемой getpass() затем можно использовать (strcmp(key1Copy, key2Copy) == 0), чтобы увидеть, если они равны.

+1

+1, также обратите внимание, что 'getpass()' устарел, его больше не следует использовать. –

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()является устаревшим и должен не использовать больше!

Смежные вопросы