2016-04-28 11 views
2

Okay, also ich versuche ein Programm zu machen, mit dem Benutzer ihre E-Mails eingeben können. Ihre E-Mail wird als gültig angesehen, wenn zwei Bedingungen erfüllt sind: A. Es muss irgendwo ein "@" Zeichen stehen und B. Es muss eine Zeit nach dem "@" sein. Ich habe den Code größtenteils verloren, aber ich habe einige Schwierigkeiten, wenn es darum geht, E-Mails zu validieren, die vor dem Zeichen "@" stehen. Wenn sie die Zeit vor dem "@" Zeichen haben, gelten sie als gültig, aber sie sollten nicht sein. Beispielsweise wird die Eingabe [email protected] als gültig angesehen.Email-Validierung in C++

Kann mir jemand helfen herauszufinden, was ich falsch gemacht habe? Vielen Dank im Voraus!

#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; 
} 
+1

A 25 Zeichenpuffer für eine E-Mail-Adresse? Ich bin mir nicht sicher, ob ich weinen sollte, weil das lächerlich kurz ist. Ihr Programm wird den Schnellzug zu undefiniertem Verhalten führen, sobald jemand die Kühnheit hat, eine Adresse länger einzugeben. "oblivion @ eternaloblivion.com" ist eine bescheidene Adresse, die um 4 Zeichen für Ihren Code zu lang ist. Aus diesem Grund sind C-Style-Puffer fester Länge wirklich schlechte Nachrichten. – tadman

+3

Der Titel könnte irreführend sein, da dies mehr "Validierung einer Teilmenge von E-Mails" ist, ist die E-Mail-Validierung [überraschend komplex] (http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html) . – user657267

+0

Einige E-Mail-Adressen enthalten möglicherweise keinen Punkt in der Domäne. Siehe RFC2822 für Details. Die Validierung der E-Mail-Adresse ist ein Tar-Baby. – jbruni

Antwort

1

Das Hauptproblem dabei ist, dass dies ein C++ Programm sein sollte, aber es wurde stattdessen ein C-Programm. strstr() und strlen() sind C-Bibliotheksfunktionen.

In modernen C++ verwenden wir std::string, Iteratoren und Algorithmen, die die gesamte Aufgabe viel kürzer und einfacher zu grok machen. Und es gibt keine Notwendigkeit, sich um Pufferüberläufe zu sorgen, entweder:

#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; 
} 

Nun ist das nicht kürzer und einfacher zu analysieren?

+0

Dieser 'if' Zustand ist für viele Normalsterbliche unerreichbar. Ich musste es ein paar Mal lesen, um sicherzustellen, dass es korrekt war. Nicht leicht zu verstehen. –

+0

Mein Verstand arbeitet auf mysteriöse Weise. Ich finde es einfacher, mich mit Iteratoren vertraut zu machen, als indexbasierte Lösungen zu verfolgen, die find() verwenden. –

+0

Das Problem ist nicht die Verwendung von Iteratoren - Iteratoren sind in Ordnung. Das Problem ist die Doppelbedingung im 'if', wobei die erste Bedingung die Argumente der zweiten ändert. Plus der Bonus, das Ergebnis einer Aufgabe mit einem dritten Wert zu vergleichen (aber hey, zumindest hast du die entsprechenden Parens hinzugefügt, um sie weniger undurchdringlich zu machen). –

1

Verwenden Sie std::string, nicht diese böse C-Zeichenfolge Sachen mit fester Größe.

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

Ich würde vorschlagen -' if (cin >> input) {...} else {... err ... } '- vermeidet Probleme mit führenden/nachgestellten/eingebetteten Leerzeichen (vorausgesetzt Post-Whitespace-Inhalt wird später irgendwie validiert) und Zeilen, die keine Nicht-Leerzeichen enthalten, oder - wenn Sie sicherstellen wollen, dass es die nächste Zeile von ist Eingabe, die die E-Mail enthält, verwenden Sie weiterhin "getline", aber überprüfen Sie, ob es erfolgreich ist, und trimmen Sie Leerzeichen/prüfen Sie anschließend, ob die Eingabe "leer" ist. –

6

Warum nicht Regex verwenden?

#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 = "[email protected]"; 

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

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

+0

"Jetzt haben Sie zwei Probleme", mit freundlicher Genehmigung des Mannes, der Stack Overflow erstellt hat! http: //blog.codinghistor.com/reguläre Ausdrücke-jetzt-du-hast-zwei-Probleme/ –

+0

Sie suchen nach einem '. Das ist nicht in den Anforderungen, aber der Rest sieht gut aus. –