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

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

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

 #include  #include  #include  #include  #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=1&&dig>=1&&c>=1) { printf("Valid Password"); } else{ printf("Invalid Password"); } return 0; } 

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

     char arr[10] = {0}; 
  • 要点2.始终限制输入长度。 通过超出预期的输入超出分配的内存,可以避免运行到未定义的行为 。

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

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

相反,做,

  size_t len = strlen(arr); for (i=0; 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 

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

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

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

您需要使用实际长度作为循环的限制,而不是硬编码限制为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 

这里有几个问题:

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