当我在下面的程序中输入密码并按下回车时,我得到一个调试 断言错误,特别是isctype.c第56行
表达式:(无符号)(c + 1)< = 256
有人可以帮我解决这个问题吗?
代码:
int main()
{
int j=0;
char pass[100];
int upper=0, lower=0, digit=0, sc=0;
printf("Enter your password:\n");
scanf("%s",&pass);
while(j!=' '){
if(isalpha(pass[j])){
if(isupper(pass[j])){
upper++;
}
else{
lower++;
}
}
else if(isdigit(pass[j])){
digit++;
}
else{
sc++;
}
j++;
}
if(upper==0||lower==0||digit==0||sc==0){
printf("Password must contain atleast one upper case, one lower case, one digit and a special character");
}
else{
printf("Good to go");
}
return 0;
_getch();
}
答案 0 :(得分:0)
您的代码中的问题似乎是
while(j!=' ')
正在检查j
对空格(' '
)的ASCII value为32(十进制)。
基本上,您无条件地使用索引为0到31的 pass
数组元素。
然后,pass
是一个自动局部变量,您没有初始化它。它包含不确定的值。
如果您的输入少于31个字符,则pass
的剩余元素将保持未初始化状态,并进一步使用它们(作为is....()
系列的参数,此处)可能会导致{{3 }}
解决方案:您不需要检查空格,(因为%s
不接受空格)。相反,您应该检查空终止符\0
。将您的代码更改为
scanf("%s",&pass);
到scanf("%99s",pass);
以避免可能的缓冲区溢出。while(j!=' ')
到while(pass[j])
循环,直到字符串终结符为空。那就是说,
_getch()
语句后使用return
没有任何意义。您可以直接删除_getch()
。main()
的推荐签名为int main(void)
。答案 1 :(得分:0)
替换
while (j!=' ')
通过
while (pass[j] != 0)
只要pass[j]
与零不同,您就想循环。请记住,字符串以零结束。