从用户输入密码并检查它是否有字符,字母和数字

时间:2015-12-16 09:59:39

标签: c arrays loops char

我怀疑的是,如果我输入填充数组的密码,程序运行正常。但是,如果我输入密码,例如“apple25”,我认为它将数组中的空格计为字符,甚至将“apple25”声明为有效密码。

如何防止这种情况发生?它是否将字符串终止符计为char?因为即使“AAPPLLEE2”也是有效密码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define TRUE 1
#define FALSE 0


int main()
{
    char arr[10];
    printf("Enter a password. \n");
    scanf("%s",arr );
   // printf(arr);
    char ch;
    int i;
    int alp=0, dig=0, c=0;


    for (i=0; i<10; i++)
    {
       ch=arr[i];

       if(isalpha(ch))
       {
           alp++;
          // printf(" alpha is %d \n",alp);
       }
       else if(isdigit(ch))
       {
           dig++;
          // printf("digit is %d \n",dig);
       }
       else
       {
           c++;
         //  printf("charectores are %d \n",c);
       }

    }
    if(alp>=1&&dig>=1&&c>=1)
        {
            printf("Valid Password");
        }
    else{
            printf("Invalid Password");
        }
        return 0;
}

4 个答案:

答案 0 :(得分:3)

  • 要点1.始终初始化自动局部变量。使您免于意外访问未初始化的值。

    char arr[10] = {0};
    
  • 要点2.始终限制输入长度。通过超出预期的输入超出分配的内存,使您免于进入undefined behavior

    scanf("%9s",arr );
    
  • 第3点。使用strlen()仅循环输入的有效部分。

答案 1 :(得分:2)

那是因为你的循环遍及整个,而不仅仅是你读到的字符。

相反,

    size_t len = strlen(arr);

    for (i=0; i<len; i++) {
      ...
    }

您可能还想使用fgets()来避免缓冲区溢出。如果输入的字符数超过10个,则会溢出arr,这是未定义的行为。

而不是

scanf("%s",arr );

DO

fgets(arr, sizeof arr, stdin);
char *p = strchr(arr, '\n');
if(p) *p = 0; //trim the trailing newline, if present

答案 2 :(得分:2)

  

我认为它将数组中的空格计为charecters,甚至将"apple25"声明为有效密码。

你的假设几乎是正确的。您的程序会在用户输入结束后对字符进行计数,但它们不一定是空白。

您可以使用"AAPPLLEE2"获得此效果,因为您的代码会检查九个字符的字符串中的十个字符。第十个字符是空终止符,既不是数字也不是字母。

您需要使用实际长度作为循环限制,而不是硬编码限制为十。

您还应该修复潜在的缓冲区溢出:

char arr[11];       // <<== Add one more character for '\0'
printf("Enter a password. \n");
scanf("%10s",arr ); // <<== Tell scanf how big is your buffer

答案 3 :(得分:0)

这里有几个问题:

  • 尝试输入大小为10或更长的密码。你溢出arr
  • 您不会停在终止NULL字符(值0)。实际上,您将终止NULL计为&#34;字符&#34;遇到它时会增加c
  • 之后的任何垃圾也会被处理。