Überprüfen, ob das eingegebene eine gültige E-Mail ist
-
Hallo,
ich muss eine Aufgabe erledigen, bei der ich allerdings etwas Schwierigkeiten habe, nach "gültigen Zeichen" zu suchen.
Das '@' kann ich erfolgreich finden, das '.' nach dem '@' ebenso. Doch wie suche ich nach "gültigen Zeichen", dass mindestens 1 solches vor dem '@' ist, zwischen dem '@' und '.' und nach dem '.' (also gültig wäre zum Beispiel a@b.c)
Bisher kriege ich es nur so hin, dass bereits "@." gültig ist. Kann mir da jemand weiterhelfen? Ich bin neu im Forum, daher hoffe ich, dass es den Code richtig einkopiert...bool is_email(std::string s){ auto b = s.begin(), e = s.end(); if ( (b=std::find(b,e,'@')) != e && std::find(b,e,'.') != e){ //Prüfung nach @ und . std::cout<<"@ and Dot are used"<<std::endl; } else{ std::cout<<"@ and/or Dot aren't/isn't used"<<std::endl; } //Prüfung von @ und . zu Ende return true; } int main(){ std::string s; std::cout<<"E-Mail eingeben"<<"\n"; std::getline(std::cin, s); is_email(s); return 0; }
-
Schau dir mal die Standartfunktion std::string::substr an.
http://www.cplusplus.com/reference/string/string/substr/
Dann musst du dir nur noch die Positionen von '@' und dem '.' "merken" und in einzel-strings zerlegen die du dann gesondert prüfen kannst.
Einfaches Werkzeug dazu wären die Regex Klasse.
Ist zugegebenermasen für einen Anfänger einfach aber mit übung und einlesen machbar.
-
Nur mit @ und . kommst du nicht hin.
Es sind auch nicht alle möglichen Zeichen erlaubt.Du kannst z.B. schauen, ob das erste Zeichen erlaubt ist.
Du kannst z.B. schauen, ob das erste Zeichen nach dem @ erlaubt ist. (Das sind aber andere als vor dem @)Zudem sollte deine Funktion nur prüfen.
Die Ausgabe an den Nutzer macht dann die rufende Funktion.
-
Ich will ja nicht der Spielverderber sein, aber gültige Emailadressen haben ein weitaus komplizierteres Format als man sich das so vorstellt. Ich habe schon oft mit einigen meiner etwas exotischeren Adressen verärgert vor dummen Prüffunktionen wie dieser hier gestanden, deren Entwickler sich eben nicht die passenden RFCs (RFC 5321 sollte hier greifen), sondern sich selber ausgedacht haben, was eine gültige Mailadresse ausmacht anhand ihrer eigenen, beschränkten Erfahrungen.
Wenn das wirklich ernsthaft angewendet werden soll, wärst du besser beraten, einen fertigen Code zu benutzen (Aber nicht von irgendeinem Niemand aus irgendeinem Noname-Forum kopieren!). Wenn das eine Hausaufgabe sein soll, könntest du deinen Lehrer beeindrucken, indem du wirklich den RFC umsetzt; ist aber eventuell eine Menge Arbeit.
-
#include <iostream> #include <boost/spirit/home/x3.hpp> namespace ParseEmailAddr { namespace detail { namespace x3 = boost::spirit::x3; namespace ascii = x3::ascii; using ascii::char_; auto VCHAR = char_(0x21, 0x7E); auto WSP = char_(' ') | '\t'; auto DQUOTE = char_('"'); auto ALPHA = char_("a-zA-Z"); auto DIGIT = char_("0-9"); auto CR = char_(0x0D), LF = char_(0x0A); auto CRLF = CR >> LF; auto obs_FWS = +WSP >> *(CRLF >> +WSP); auto FWS = (-(*WSP >> CRLF) >> +WSP) | obs_FWS; auto obs_NO_WS_CTL = char_(1, 8) | char_(11) | char_(12) | char_(14-31) | char_(127); auto obs_ctext = obs_NO_WS_CTL; auto obs_qtext = obs_NO_WS_CTL; auto ctext = char_(33, 39) | char_(42, 91) | char_(93, 126) | obs_ctext; auto obs_qp = '\\' >> ('\0' | obs_NO_WS_CTL | LF | CR); auto quoted_pair = ('\\' >> (VCHAR | WSP)) | obs_qp; x3::rule<struct comment> comment; auto comment_def = '(' >> *(-FWS >> (ctext | quoted_pair | comment)) >> -FWS >> ')'; BOOST_SPIRIT_DEFINE(comment); auto CFWS = (+(-FWS >> comment) >> -FWS) | FWS; auto qtext = char_(33) | char_(35, 91) | char_(93, 126) | obs_qtext; auto qcontent = qtext | quoted_pair; auto quoted_string = -CFWS >> DQUOTE >> *(-FWS >> qcontent) >> -FWS >> DQUOTE; auto atext = ALPHA | DIGIT | char_("-!#$%&'*+/=?^_`{|}~"); auto atom = -CFWS >> +atext >> -CFWS; auto word = atom | quoted_string; auto dot_atom_text = +atext >> *('.' >> +atext); auto dot_atom = -CFWS >> dot_atom_text >> -CFWS; auto obs_local_part = word >> *('.' >> word); auto obs_domain = atom >> *('.' >> atom); auto obs_dtext = obs_NO_WS_CTL | quoted_pair; auto dtext = char_(33, 90) | char_(94, 126) | obs_dtext; auto domain_literal = -CFWS >> '[' >> *(-FWS >> dtext) >> -FWS >> ']' >> -CFWS; auto domain = dot_atom | domain_literal | obs_domain; auto local_part = dot_atom | quoted_string | obs_local_part; x3::rule<struct address> address; auto address_def = local_part >> '@' >> domain; BOOST_SPIRIT_DEFINE(address); } using detail::address; } int main() { for (std::string str; getline(std::cin, str);) { auto iter = begin(str); if (parse(iter, end(str), ParseEmailAddr::address) && iter == end(str)) std::cout << "Valid!"; else std::cout << "Nope!"; std::cout << std::endl; } }
-
Gott, hast du das kopiert oder selbst geschrieben, schaut ja grauenvoll aus.
-
out schrieb:
Gott, hast du das kopiert oder selbst geschrieben, schaut ja grauenvoll aus.
Das ist selbst geschrieben. Und was meinst du mit grauenvoll?