为什么在运行代码时出现调试断言失败错误

时间:2015-06-11 13:44:55

标签: c loops debugging while-loop

当我在下面的程序中输入密码并按下回车时,我得到一个调试 断言错误,特别是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();
}

2 个答案:

答案 0 :(得分:0)

您的代码中的问题似乎是

while(j!=' ')

正在检查j对空格(' ')的ASCII value为32(十进制)。

基本上,您无条件地使用索引为0到31的 pass数组元素。

然后,pass是一个自动局部变量,您没有初始化它。它包含不确定的值。

如果您的输入少于31个字符,则pass的剩余元素将保持未初始化状态,并进一步使用它们(作为is....()系列的参​​数,此处)可能会导致{{3 }}

解决方案:您不需要检查空格,(因为%s不接受空格)。相反,您应该检查空终止符\0。将您的代码更改为

  1. scanf("%s",&pass);scanf("%99s",pass);以避免可能的缓冲区溢出。
  2. while(j!=' ')while(pass[j])循环,直到字符串终结符为空。
  3. 那就是说,

    • 无条件 _getch()语句后使用return没有任何意义。您可以直接删除_getch()
    • main()的推荐签名为int main(void)

答案 1 :(得分:0)

替换

while (j!=' ')

通过

while (pass[j] != 0)

只要pass[j]与零不同,您就想循环。请记住,字符串以零结束。