如何传递std :: cin作为函数的参数?

时间:2019-11-14 05:32:36

标签: c++

我一直在寻找关于stackoverflow的答案,但是根本没有得到答案。一个很好的解释的答案将是惊人的。

这是我的不完整代码,用于密码验证程序。我要求用户输入,然后通过一系列布尔函数运行它,以确定它是否符合严格的密码标准。

如果您发现任何其他错误(我确定有),请告诉我。谢谢!

#include <iostream>
#include <ctype.h>
#include <cstring>

//DECLARING GLOBAL VARIABLES
bool isLong;
bool hasDigits;
bool hasAlphabets;
bool hasSpecial;

//FUNCTION TO CHECK IF PASSWORD IS LONG ENOUGH
 bool  checklen(std::string x)
{
    if (x.length() > 8)
    {
        isLong = true;
    }
    else if (x.length() < 8)
    {
        isLong = false;
    }
    return isLong;
}

//FUNCTION TO CHECK IF PASSWORD HAS DIGITS
bool checkdigits(std::string x)
{
    for (int i = 0; i < x.length(); i++)
    {
        if (isdigit(x[i]))
        {
            hasDigits = true;
        }

        else if (not isdigit(x[i]))
        {
            hasDigits = false;
        }
    }
    return hasDigits;
}

//FUNCTION TO CHECK IF PASSWORD HAS ALPHABETS
bool checkalphabets(std::string x)
{
    for (int i = 0; i < x.length(); i++)
    {
        if (isalpha(x[i]))
        {
            hasAlphabets = true;
        }

        else if (not isalpha(x[i]))
        {
            hasAlphabets = false;
        }
    }
    return hasAlphabets;
}

//MAIN FUNCTION THAT RUNS THE VALIDATION AND HANDLES LOGIC
int main()
{
    std::cout << "enter new password: ";
    std::string password{};
    std::cin >> password;

    checklen(password);                  //trying pass the stored cin value as argument.
    checkdigits(password);              //trying to pass the stored cin value as argument.
    checkalphabets(password);          //trying to pass the stored cin value as argument.

                                                                //the functions literally use "password" as a string instead of the stored user input.

    if (isLong = true)
    {
        if (hasDigits = true)
        {
            if (hasAlphabets = true)
            {
                std::cout << "Your password is strong";
            }
        }
    }

    else
    {
        std::cout << "Your password is still weak";
    }

    return 0;
}



2 个答案:

答案 0 :(得分:2)

  

如何将std :: cin作为函数的参数传递?

std::cinstd::istream。因此,将其传递给函数的方式如下:

void function(std::istream& stream) {
    // implmentation...
}

注意:我相信您不能按值传递std::istream。您必须通过引用将其传递。

然后您这样称呼它:

function(std::cin);

请注意,您的程序中还有其他错误,请参见the other answer。但这通常就是将std::cin传递给函数的方式。

答案 1 :(得分:2)

#include <iostream>
#include <algorithm>

bool isLong(std::string x)
{
    return x.length() > 8;
}

bool hasDigits(std::string x)
{
  return std::any_of(x.begin(), x.end(), ::isdigit);
}

bool hasAlpha(std::string x)
{
  return std::any_of(x.begin(), x.end(), ::isalpha);
}

bool isStrong(std::string x)
{
  return isLong(x) and hasDigits(x) and hasAlpha(x);
}

int main()
{
  std::string password;
    std::cout << "enter new password: ";
    std::cin >> password;

    if (isStrong(password))
      std::cout << "Your password is strong";
    else
      std::cout << "Your password is weak";

    return 0;
}

我假设

  

如果您发现任何其他错误(我确定有),请让我   知道。谢谢!

您想找到最“高效”的程序。

  1. 最重要的错误是您改用了一个等号 两个。这意味着您只是将一个值分配给 if语句中的变量,不检查是否相等。
  2. 如果以下情况,您的checklen函数将返回未初始化的boolean 密码的长度正好为8
  3. 您的checkdigits函数存在逻辑错误。的 返回值取决于最后检查的字符-而不是整个字符 串。如果最后一个字符是数字,它将返回true, 否则它将返回false,而不考虑整体 字符串。
  4. checkalphabets中也存在与上述相同的逻辑错误 功能。
  5. std::string的声明中不需要包括一个空的初始化程序列表。
  6. if循环的嵌套不是必需的,因为您可以简单地使用&&运算符。
  7. 在密码没有数字并且不是字母的情况下,您的程序不会输出“您的密码仍然很弱”。如果密码不够长,则仅输出以上内容。
  8. 在程序中不必使用全局变量,而在处理最佳编程实践时会感到厌烦。它们可用于所有函数,类-但是,如果定义同名变量,则将出现重新声明错误。 (这只是使用全局变量时的一个问题。)

我上面发布的代码就是我认为的“最优”代码。它使用内置函数来减少代码复杂性,因此需要更多考虑。

如果您是编程的新手(我会假设),建议您尝试“空运行”代码,因为这将帮助您识别逻辑错误。

等号的语法错误应由良好的编译器处理。 (或者更确切地说,是逻辑错误,因为语法是“有效的”,但是99%的时间不是预期的。)

可以通过经验减少程序代码的效率(例如嵌套的if循环)。