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