布尔函数从不返回假…为什么?

huangapple go评论41阅读模式
英文:

Bool fonction never returns FALSE... why?

问题

我卡在CS50第2周的密码问题上。
我已经解决了大部分问题,但无论我输入什么,返回值总是TRUE。

我漏掉了什么吗?

// TODO: 完成下面的布尔函数
bool valid(string password)
{

int validation;
validation = 0;

//找到字符串(密码)的长度

for (int n = 0; n < strlen(password); n++)

//满足布尔值为true的条件

 {
    if (isupper(password[n]))
     {
         validation = validation + 1;
     }

    if (islower(password[n]))
     {
          validation = validation + 1;
     }

    if (ispunct(password[n]))
     {
         validation = validation + 1;
     }

   if (isdigit(password[n]))
     {
          validation = validation + 1;
     }
 }
   if (validation == 4)
    {
        return true;
    }
   else
   {
        return false;
   }

}

英文:

I am stuck on CS50 week 2 password problem.
I have figured out most of it, but no matter what I input, the return is always TRUE.

What am I missing?

// TODO: Complete the Boolean function below
bool valid(string password)
{

int validation;
validation = 0;

//find length of string (password)

for (int n = 0; n < strlen(password); n++)

//conditions to achieve for the bool to be true

 {
    if (isupper(password[n]))
     {
         validation = validation + 1;
     }

    if (islower(password[n]))
     {
          validation = validation + 1;
     }

    if (ispunct(password[n]))
     {
         validation = validation + 1;
     }

   if (isdigit(password[n]))
     {
          validation = validation + 1;
     }
 }
   if (validation == 4)
    {
        return true;
    }
   else
   {
        return false;
   }

}

答案1

得分: 0

你每当满足其中一个条件时就会增加“validation”,但密码中的多个字符可能会满足这些条件。实际上,如果密码仅包含大写字母、小写字母、数字或标点字符(几乎除了空格以外的任何字符!),那么每个字符都会增加“validation”一次,所以“validation”将等于密码的长度。

考虑一个输入“TEST”:每个字符都符合大写字母的条件,所以“validation”增加了4次,所以最终“validation == 4”,然后返回“true”,尽管它并未满足所有条件。

然后考虑另一个输入“Test1!”:

  • 第一个字符“T”是大写字母,所以“validation += 1” => “1”
  • 第二个字符“e”是小写字母,所以“validation += 1” => “2”
  • 第三个字符“s”是小写字母,所以“validation += 1” => “3”
  • 第四个字符“t”是小写字母,所以“validation += 1” => “4”
  • 第五个字符“1”是数字,所以“validation += 1” => “5”
  • 第六个字符“!”是标点符号,所以“validation += 1” => “6”

... 然后返回“false”。

问题在于它允许每个满足的条件多次。你的工作代码需要单独考虑每个条件。

英文:

You're incrementing validation every time one of the conditions is met, but the conditions may be met by multiple characters in the password.

In fact, if the password contains only characters that are an uppercase letter, a lowercase letter, a number, or a punctuation character (pretty much anything except a space!) then you'll increment validation once for each character, so validation will equal the length of the password.

Consider an input TEST: each character matches the uppercase condition, so validation is incremented 4 times, so the final validation == 4, which then returns true, even though it didn't satisfy all the conditions.

Then consider a different input Test1!:

  • first character T is uppercase, so validation += 1 => 1
  • second character e is lowercase, so validation += 1 => 2
  • third character s is lowercase, so validation += 1 => 3
  • fourth character t is lowercase, so validation += 1 => 4
  • fifth character 1 is a number, so validation += 1 => 5
  • sixth character ! is punctuation, so validation += 1 => 6

... which then returns false.

The problem is that it's allowing each satisfied condition multiple times. Your working code will need to consider each condition separately.

huangapple
  • 本文由 发表于 2023年2月20日 01:02:36
  • 转载请务必保留本文链接:https://go.coder-hub.com/75501860.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定