L'Email de validation en C++
Bon alors je suis en train de faire un programme qui permet à l'utilisateur d'entrer son e-mail. Leur e-mail sera considéré comme valable que si deux conditions sont remplies: A. il doit y avoir un signe "@" quelque part là-bas et B. il doit y avoir une période après le "@". J'ai eu le code en bas pour la plupart, mais j'ai quelques difficultés quand il s'agit de la validation des e-mails qui ont une période avant le signe"@". Si ils ont de la période avant le signe "@" ils sont considérés comme valides, mais ils ne devraient pas l'être. Par exemple, en entrant text.example@randomcom
est considéré comme valide.
Quelqu'un peut-il m'aider à comprendre ce que j'ai fait de mal? Je vous remercie à l'avance!
#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;
}
- 25 tampon de caractères pour une adresse email? Je ne suis pas sûr si je devrais pleurer parce que c'est ridiculement court. Votre programme va prendre le train express pour un comportement indéterminé dès que quelqu'un a l'audace de se taper une adresse plus que cela.
[email protected]
est un modeste longueur de l'adresse qui est trop long par 4 caractères de votre code. C'est pourquoi fixe-longueur de C style tampons sont vraiment de mauvaises nouvelles. - Le titre peut être trompeur, car ce n'est plus la "validation d'un sous-ensemble de e-mails", l'email de validation est étonnamment complexe.
- Certaines adresses ne contiennent pas d'un point dans le domaine. Voir RFC2822 pour plus de détails. Adresse Email de validation est un tar-bébé.
- Êtes-vous limité à l'utilisation
<cstring>
? Ou pouvez-vous utiliser<algorithm>
et<regex>
?
Vous devez vous connecter pour publier un commentaire.
Pourquoi ne pas utiliser des regex?
http://en.cppreference.com/w/cpp/regex
.
ou_
avant la@
? Ce n'est pas dans les exigences, mais le reste a l'air bon.Le principal problème ici est que c'est censé être un programme en C++, mais, au lieu de cela, il est devenu un programme C.
strstr
() etstrlen
() sont des fonctions de la bibliothèque C.En C++ moderne que nous utilisons
std::string
, itérateurs, et des algorithmes, ce qui rend la tâche beaucoup plus court et plus facile à analyser. Et il n'y a pas besoin de s'inquiéter à propos de dépassements de la mémoire tampon, soit:Maintenant, n'est-ce pas plus court et plus facile à analyser?
if
état est au-delà de la portée d'un grand nombre de simples mortels. J'ai dû lire plusieurs fois pour s'assurer qu'elle est correcte. Pas facile à comprendre.if
où la première condition modifie les arguments de la seconde. Plus le bonus de comparer le résultat d'une cession à un tiers de la valeur (mais bon, au moins vous avez ajouté l'appropriées parens pour le rendre moins impénétrable).getline
que j'ai faite en vertu de John réponse s'applique ici....strstr()
etstrlen()
n'est pas uneC
programme.Utilisation
std::string
, pas que le méchant de taille fixe C de la chaîne de trucs.if (cin >> input) { ... } else { ...err... }
- évite les problèmes avec avant/après/embedded d'espaces (en supposant post-blanc contenu sera validé en quelque sorte par la suite) et les lignes qui ne contiennent pas de tout non-blanc, ou si vous voulez vous assurer que c'est de la très prochaine de la ligne d'entrée qui contient l'e-mail, gardez à l'aide degetline
mais vérifiez qu'il réussit et garniture espaces / case videinput
par la suite.Vous avez très restreint, et des règles spécifiques sur les adresses e-mail valides qui ne sont pas le reflet de réelle adresses e-mail. En supposant que c'est intentionnel, le principal problème que je vois est que vous écrivez des boucles lorsque vous n'avez pas besoin. La fonction de la bibliothèque
strstr()
la boucle pour vous. Vous venez de passer de la chaîne et il sera en boucle à travers la recherche de lachar
.Donc, de laisser la fonction de faire la recherche pour vous, vous pouvez diviser et conquérir le problème comme ceci:
lors de la recherche du caractère@, puis après ça, au lieu de chercher '.' du début de la chaîne, vous pouvez commencer à partir de la valeur précédente de la variable i.
Remarque:- je ne pense pas beaucoup à ce sujet et tous les autres cas.
Il devrait être:
au lieu de:
>
n'est pas bien défini. Deuxièmement, il n'a pas d'avantages à tous dans ce programme. (Le&
était probablement pas souhaité)