我怀疑的是,如果我输入填充数组的密码,程序运行正常。但是,如果我输入密码,例如“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;
}
答案 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)
这里有几个问题:
arr
。c
。