2014-09-23 4 views
0

그래서 간단한 암호 프로그램을 만들고 있습니다. 루프가 중단됩니다 - 지금까지입력 한 문자 수를 제한하는 방법

/* simple password prog */ 
#include<stdio.h> 
#include<string.h> 
int main(){ 
     char usrIn[9]; 
     char password[]={"AXcd8002"}; 
     do { 

     fprintf(stdout,"\n Password:"); 
     fgets(usrIn,9, stdin); 
     if (strcmp(usrIn,password)<0 || strcmp(usrIn,password)>0) { 
     fprintf(stdout,"\n Password incorrect"); }; 

     }while((strcmp(password,usrIn))!=0); 

fprintf(stdout, "\n The password is correct \n"); 
return 0; 
} 

이 코드는 암호가 잘못된 경우가 맞습니다 경우, 루프는 계속됩니다, 제대로 작동이 코드를 가지고있다. 하지만 작동하지 않는 것은 다음과 같습니다. 사용자가 적어도 한 문자 이상 암호를 입력하면 프로그램은 여전히 ​​올바른 것으로 말합니다. 예를 들어, 사용자가 AXcd8002AAA를 입력하면 fgets는 AXcd8002 만 읽고 AAA는 무시합니다. 어떻게 이런 일이 일어나지 않도록 할 수 있습니까?

+3

버퍼를 암호보다 크게 만듭니다. 간단하지 않습니까? 또한 strcmp는 암호에 대해 다른 시간을 소비하므로 strcmp는 안전하지 않으므로 시간을 측정하면 문자의 쓰기 및 잘못된 순서를 결정할 수 있습니다. –

+0

감사합니다, 이반. 이것은 단지 클래스 할당 일뿐입니다. 그래서 지금은 문자열을 다루고 있습니다. 그래서 그것이 너무 단순합니다. 그래서 내가 올바른 문자열을 입력 했는데도 char usrIn [10]과 fgets (usrIn, 10, stdin)을 만들었고, 패스워드가 맞지 않다고 불평한다. –

+0

fgets는 '\ n'을 포함한 모든 문자를 읽는다. 먼저 '\ n'이 처음 나타날 때까지 길이를 확인하십시오. 길이가 좋으면 \ n을 0으로 대체하고 문자열을 비교하십시오 (buffer [9] = '\ 0'). –

답변

3

에는 9 개의 문자 만 있지만, 추가 문자는 무시됩니다. 그냥 usrIn에게 충분한 공간을 제공 :

char usrIn[100]; 

을 그리고 가장 좋은 방법 : 새로운 라인 문자 '\n' 유효한 문자로 간주됩니다

fgets(usrIn, sizeof(usrIn), stdin); 

은 고려하지 않은 다른 문제가 있습니다 fgets이므로 usrIn이기도하므로 비밀번호를 비교하기 전에 수동으로 제거해야합니다.

+0

저는 제안 된 조정을했습니다. 대체 된 문자 usrIn [100]; 및 fgets (usrIn, sizeof (usrIn), stdin); 하지만 지금은 적절한 암호를 입력해도 암호가 잘못되었다는 문구가 있습니다. –

+0

@Xieerqi 편집을 참조하십시오. –

+0

char password [] = { "AXcd8002 \ n"}와 같이 비밀번호에 \ n을 (를) 추가했습니다. 이것은 문제를 해결하지만, 아마도 최선의 방법은 아닙니다. 맞습니까? 당신은 내가 fgets에서 그것을 제거해야한다고 언급했는데 어떻게 달성 될 수 있습니까? –

0

동적 크기를 부여하는 usrIn의 크기를 지정하지 않고 & 동적 입력을 수행하면 전체 암호가 usrIn 배열에 삽입됩니다.

+0

그래서 char usrIn [];을 남겼습니다. gcc 컴파일러는 나에게 이것을 제공합니다 : "password2.c : 함수 'main': password2.c : 5 : 7 : 오류 : 'usrIn'에 배열 크기가 없습니다 char usrIn []; ^ " –

관련 문제