【发布时间】:2019-02-14 12:51:45
【问题描述】:
有人能解释一下为什么strcmp 会返回相同的值,即使密码正确/不正确?我在包含部分下方定义了有效密码,并在程序结束时输入了一个来检查它。
这是我的代码:
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <termios.h>
#define TIME 10
#define MAXPASSWORD 12
#define PASSWORD "pass123"
void sigalrm_handler() {
printf("\nERR: Time is up...\n");
}
int getch() {
struct termios oldtc, newtc;
int ch;
tcgetattr(STDIN_FILENO, &oldtc);
newtc = oldtc;
newtc.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newtc);
ch=getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldtc);
return ch;
}
int main(int argc, char * argv[]) {
char password[MAXPASSWORD] = {0};
printf("Enter correct password. You have %d seconds: ", TIME);
signal(SIGALRM, sigalrm_handler);
alarm(TIME);
fflush(stdout);
for(int i=0; i<MAXPASSWORD; i++)
{
password[i] = getch();
if (password[i] == '\n')
break;
printf("*");
}
if (strcmp(password, PASSWORD) == 0) {
printf("\nValid password\n");
} else {
printf("\nInvalid password\n");
}
}
【问题讨论】:
-
相同的值是多少?
-
在代码末尾添加
printf("<%s> <%s>\n", password, PASSWORD);,检查输出,你可能会发现。 -
你是不是总是在用户输入缓冲区中存储一个额外的换行符(就像
fgets()一样)? -
当
getchar()已经可用时,为什么还要在代码中定义getch()? (getch() is a nonstandard function . It is not part of the C standard library or ISO C....) -
这不起作用,因为 '\n' 始终是字符串输入的一部分,而不是宏的一部分。如果你添加密码[i] = '\0';在 if 检查内部和中断之前;这个程序可以正常工作。