web-dev-qa-db-ja.com

C ++での電子メール検証

さて、ユーザーがメールを入力できるプログラムを作ろうとしています。 2つの規定が満たされている場合、それらの電子メールは有効であると見なされます。A。どこかに「@」記号があり、B。「@」の後にピリオドが必要です。ほとんどの部分でコードを取得しましたが、「@」記号の前にピリオドがある電子メールの検証に関しては、いくつかの問題があります。 「@」記号の前にピリオドがある場合、それらは有効と見なされますが、そうではありません。たとえば、text.example@randomcomの入力は有効と見なされます。

誰かが私が間違ったことを理解するのを手伝ってくれる?前もって感謝します!

#include <iostream>
#include <cctype>
#include <cstring>
using namespace std;

int main()
{
    int x = 25; //random size enough to hold contents of array plus one for               null terminator
    char input[x]; //array to hold input
    int sizeOf; //holds length of input array
    char* ptr = nullptr; //pointer
    char* ptr2 = nullptr; //pointer

    cout << "Enter your email address\n";
    cin.getline(input,x);
    sizeOf = strlen(input);

    for(int i = 0; i < sizeOf; i++)
    {
        ptr= strstr(input, "@"); //searches input array for "@" string
        if(ptr != nullptr) 
        {
            break;
        }
    }

    for(int i = 0; i < sizeOf; i++)
    {
        ptr2 = strstr(input, "."); //searches input array for "." string
        if(ptr2 != nullptr && &ptr2 > &ptr)
        {
            break;
        }
    }

    if(ptr != nullptr) //validates input of "@" sign
    {
        if(ptr2 != 0 && &ptr2 < &ptr) 
            {
                cout << "Email accepted.\n";
            }

        else
            {
                cout << "Missing . symbol after @\n";
            }
    }

    else
    {
        cout << "Missing @ symbol\n";
    }



return 0;
}
6

正規表現を使用してみませんか?

#include <iostream>
#include <string>
#include <regex>

bool is_email_valid(const std::string& email)
{
   // define a regular expression
   const std::regex pattern
      ("(\\w+)(\\.|_)?(\\w*)@(\\w+)(\\.(\\w+))+");

   // try to match the string with the regular expression
   return std::regex_match(email, pattern);
}

int main()
{
    std::string email1 = "text.example@randomcom";

    std::cout << email1 << " : " << (is_email_valid(email1) ?
      "valid" : "invalid") << std::endl;
}

http://en.cppreference.com/w/cpp/regex

14
gonjay

ここでの主な問題は、これがC++プログラムであるはずなのに、代わりにCプログラムになったということです。 strstr()とstrlen()はCライブラリ関数です。

最新のC++では、std::string、イテレータ、およびアルゴリズムを使用します。これにより、タスク全体がはるかに短くなり、作業が容易になります。また、バッファオーバーフローについて心配する必要もありません。

#include <string>
#include <algorithm>

// Your main() declaration here, etc...

std::string input;

std::cout << "Enter your email address" << std::endl;
std::getline(std::cin, input);

auto b=input.begin(), e=input.end();

if (  (b=std::find(b, e, '@')) != e &&
      std::find(b, e, '.') != e )
{
    std::cout << "Email accepted" << std::endl;
}
else
{
    std::cout << "Email rejected" << std::endl;
}

さて、それは短く、解析しやすいのではないでしょうか?

2
Sam Varshavchik

使用する std::string、それほど厄介な固定サイズのC文字列のものではありません。

int main()
{
    string input;
    cout << "Enter your email address\n";
    getline(cin, input);

    size_t at = input.find('@');
    if (at == string::npos)
    {
        cout << "Missing @ symbol\n";
        return 1;
    }

    size_t dot = input.find('.', at + 1);
    if (dot == string::npos)
    {
        cout << "Missing . symbol after @\n";
        return 2;
    }

    cout << "Email accepted.\n";
    return 0;
}
1
John Zwinck

以下の方法を使用してみてください。

bool ValidateEmail(string email)
{
    if (regex_match(email, regex("([a-z]+)([_.a-z0-9]*)([a-z0-9]+)(@)([a-z]+)([.a-z]+)([a-z]+)"))) 
        return true;

    return false;
}
0
coder_doe
static bool IsEmailAddress(const std::string& str)
{
    // Locate '@'
    auto at = std::find(str.begin(), str.end(), '@');
    // Locate '.' after '@'
    auto dot = std::find(at, str.end(), '.');
    // make sure both characters are present
    return (at != str.end()) && (dot != str.end());
}
0
dshvets1

実際の電子メールアドレスを反映していない有効な電子メールアドレスについては、非常に制限された特定のルールがあります。それが意図的なものだとすると、私が目にする主な問題は、必要のないときにループを作成していることです。ライブラリ関数strstr()がループを実行します。文字列を渡すだけで、ループしてcharを探します。

したがって、関数に検出を行わせると、次のように分割統治することができます。

bool is_valid(char const* email)
{
    auto at_pos = std::strchr(email, '@');

    if(at_pos == nullptr)
        return false; // did not find an '@' (rule A violation)

    auto dot_pos = std::strchr(email, '.');

    if(dot_pos == nullptr)
        return false; // did not find an '.' (rule B violation)

    if(dot_pos < at_pos)
        return false; // '.' found before '@' (rule B violation)

    return true; // all rules followed!
}
0
Galik