电子邮件验证程序中的布尔变量问题

时间:2019-05-03 16:22:30

标签: c++ c++11

我正在尝试创建一个不使用正则表达式库的电子邮件验证程序。在我的一个函数中,我想返回一个布尔值以检查电子邮件地址中是否有@符号,以及它是否处于有效位置(@符号不能为字符串的前三个字符之一)。但是,我遇到了问题,因为每次我通过输入电子邮件地址(在@位置无效的位置)运行该程序时,都会不断告诉我该电子邮件有效。请帮忙!

valid = checkEmail(email); //function call 

if(valid == true)
  cout << "Your email is valid!" << endl;

else
  cout << "Your email is invalid!" << endl;


bool checkEmail(string email)
{
  int counter;
  int length;
  bool firstThree; //checks to make sure @ is not in the first three chars

  counter = 0;
  length = email.length();
  firstThree = false;

  for(int i = 0; i < length; i++)
  {
    if(email[i] == '@')
      counter++;
  }

 for(int y = 0; y < length; y++)
 {
   if(email[0] == '@' || email[1] == '@' || email[2] == '@')
      firstThree = true;

   else
       firstThree = false;

 }

 cout << "\n" << counter << endl; //check to see if counter works

 if(counter != 1 && firstThree == true)
   return false;

 else
   return true;
}

2 个答案:

答案 0 :(得分:0)

我猜您需要在程序开始时定义函数bool checkEmail(string email)。基本上翻转if else和函数定义。

bool checkEmail(string email)
{
  int counter;
  int length;
  bool firstThree; //checks to make sure @ is not in the first three chars

  counter = 0;
  length = email.length();
  firstThree = false;

  for(int i = 0; i < length; i++)
  {
    if(email[i] == '@')
      counter++;
  }

 for(int y = 0; y < length; y++)
 {
   if(email[0] == '@' || email[1] == '@' || email[2] == '@')
      firstThree = true;

   else
       firstThree = false;

 }

valid = checkEmail(email); //function call 

if(valid == true)
  cout << "Your email is valid!" << endl;

else
  cout << "Your email is invalid!" << endl;

答案 1 :(得分:0)

这里似乎有很多初学者的错误,所以我建议首先学习编程和c ++的基础知识,并像其他建议那样使用调试器。这是一些错误:

函数定义

c++与其他常见语言不同,在某种意义上,必须先定义函数才能使用它们。这意味着您要么需要将checkEmail函数移到函数调用上方,要么需要在函数调用上方创建一个单独的定义,例如:

bool checkemail(string email);

例如。

错误的if语句逻辑;不必要的循环:

我假设基于电子邮件的格式,如果checkEmail函数与正确的格式不匹配,您希望@函数返回false,并且基于函数当前的功能,这意味着如果电子邮件中前三个字符为@ ,则返回false。但是,您使用了&&运算符,它表示and,这意味着即使您不想使用它也将返回true(就像@Yastanub在其第一条评论中所述)。更好的是,可以使用带有while循环和向量(类似于std::string::find)的this method来简化整个逻辑和if语句:

vector<size_t> posVec;
size_t pos = email.find('@', 0); //note that this can be an int instead of size_t, but it can cause stack overflow with bigger numbers
while(pos != string::npos){
    posVec.push_back(pos);
    pos = email.find('@', pos+1);
}
switch(posVec.size()){
    //if there is only one @ symbol found
    case 1:
        bool firstThree = false;
        for(int i = 0; i <= 2; i++)
            //if there is only one @ but it's in the first 3 positions, the email isn't valid
            if(posVec[0] == i)
                firstThree = true;
        return !firstThree;
    //otherwise the email doesn't work
    default:
        return false;
}

请记住包括必需的库以使该部分正常工作:

#include <string>
#include <vector>

这还消除了函数中的第二个for循环,该循环是无用的,因为未使用变量y和用于测试的counter

另一个笔记

也不需要使用if (valid == true)。您只能使用if (valid),因为布尔值如何与if语句一起使用。