2014-09-23 143 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对于密码也是不安全的,因为它会花费不同的时间来写错误和写密码,所以如果你测量时间,你可以确定写入和错误的字符序列。 – 2014-09-23 05:17:01

+0

谢谢,伊万。这仅仅是课堂作业,我们现在正在翻阅字符串,所以这就是为什么它很简单。所以我做了char usrIn [10]和fgets(usrIn,10,stdin),即使我输入正确的字符串,它也会抱怨密码不正确 – 2014-09-23 05:26:32

+0

fgets读取所有字符,包括'\ n'(当您单击Enter时)。因此,首先在'\ n'出现之前检查长度。如果长度很好,用0代替\ n并比较字符串(buffer [9] ='\ 0')。 – 2014-09-23 05:48:48

回答

3

usrIn只有9个字符,当然多余的字符被忽略。只要给usrIn足够的空间:

char usrIn[100]; 

而作为一个最佳实践:

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

有,你没有考虑另一个问题:换行字符'\n'被认为是一种有效的字符由fgets,所以它也在usrIn,你需要在比较密码之前手动删除它。

+0

我提出了调整建议,替代char usrIn [100];和fgets(usrIn,sizeof(usrIn),stdin);但现在它抱怨密码不正确,即使我输入了正确的密码 – 2014-09-23 05:28:45

+0

@谢尔奇请参阅编辑。 – 2014-09-23 05:34:32

+0

我已将\ n添加到密码中,如char password [] = {“AXcd8002 \ n”};这解决了这个问题,但可能不是最佳实践,对吧?你提到我需要将它从fgets中删除,那怎么能实现? – 2014-09-23 05:38:12

0

不给usr的大小给它动态大小&执行动态输入会将完整的密码插入到数组usrIn中。

+0

所以我留下了char usrIn [];像这样,但是现在gcc编译器给了我这个:“password2.c:在函数'main'中: password2.c:5:7:error:array size in'usrIn' char usrIn []; ^ ” – 2014-09-23 05:30:15