【问题标题】:Input a password from the user and check if it has a char, alphabet and digit输入用户的密码并检查是否有字符、字母和数字
【发布时间】:2016-03-22 09:41:31
【问题描述】:

我的疑问是,如果我输入填充数组的密码,程序可以正常工作。但是,如果我输入诸如“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;
}

【问题讨论】:

    标签: c arrays loops char


    【解决方案1】:
    • 第 1 点。始终初始化您的自动局部变量。避免您意外访问未初始化的值。

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

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

    【讨论】:

      【解决方案2】:

      那是因为你的循环贯穿整个,而不仅仅是你阅读的字符。

      相反,

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

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

      代替

      scanf("%s",arr );
      

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

      【讨论】:

        【解决方案3】:

        我认为它将数组中的空格算作字符,甚至将"apple25" 声明为有效密码。

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

        "AAPPLLEE2" 会产生这种效果,因为您的代码会检查 9 个字符的字符串中的 10 个字符。第 10 个字符为空终止符,既不是数字也不是字母。

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

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

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

        【讨论】:

          【解决方案4】:

          这里有几个问题:

          • 尝试输入大小为 10 或更长的密码。你会溢出arr
          • 您不会停留在终止 NULL 字符(值 0)处。实际上,您将终止的 NULL 视为“字符”,并在遇到它时增加 c
          • 之后的所有垃圾也会被处理。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-02-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-20
            • 1970-01-01
            • 2020-07-28
            相关资源
            最近更新 更多