Ir ao conteúdo
  • Cadastre-se

C Verificar se um e-mail é válido ou não


Igor Vargas

Posts recomendados

Eu fiz esse código para a verificação mas ele n esta reconhecendo a condição.

 do{
        printf("Digite seu e-mail:");
        fflush(stdin);
        gets(al[cont].email);
        for (i = 0; i < strlen(al[i].email); i++) {
       	if(al[i].email=='@'){
       	salva_A=i;	
       	printf("%d",salva_A);
		   }else if(al[i].email=='.'){
		   	salva_B=i;
		   }
       if(al[i].email < 2 && al[i].email=='@'){
       	printf("E-mail invalido!");
	   yy=1;
	   }
	   else if(al[i+salva_A].email=='@' && al[i+salva_B].email=='.'){
	   	printf("E-mail valido!");
	   	yy=0;
	   }
}
      
	   }while(yy!=0); 

 

  • Obrigado 1
  • Triste 1
Link para o comentário
Compartilhar em outros sites

@Igor Vargas Olá. Só uma dúvida: Esse é aquele mesmo exercício para validar o nome e o e-mail?

Se é o mesmo e se você não pode fazer uso d nenhuma função você vai ter que trabalhar com índices para validar o e-mail.

Uma string é um vetor de caracteres (char). Logo, uma string, sendo um vetor, é indexada. Ou seja: o primeiro índice é o 0, o segundo o 1 etc... 

No caso do e-mail não tem como saber em q índice da string o '@' está. Por isso é preciso usar um for ou while para percorrer toda a string (um e-mail é uma string) 'procurando' se no e-mail tem o  '@'. Se achou, aí verificar o q for preciso. Tal como se os dois índices anteriores ao índice onde está o '@' são diferentes d espaços, etc...

É tal como foi falado da outra vez. Se é o mesmo exercício, claro

Qualquer coisa é só perguntar, ok?

Link para o comentário
Compartilhar em outros sites

Olá todos!

  • É difícil porque existem muitas coisas que pode fazer vários inválidos. Vejo situação de se perguntar; o que é um e-mail invalido? 

Por exemplo @devair1010 nos diz o que é um e-mail válido 

Em 22/06/2018 às 00:34, devair1010 disse:

verifique se o email tem o arroba e se tem oito ou mais caracteres no inicio até o arroba e se tem o pontocom

 

Basta buscas essas strings com a função strstr( ... )

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@AnsiC

2 horas atrás, AnsiC disse:

Basta buscas essas strings com a função strstr( ... )

 

Me parece q é esse o problema. Ele não pode fazer uso de funções como essa. 

Segundo o q o autor do tópico me disse, o professor deles é bastante rígido nessa parte e só aceita o uso dos recursos q foram vistos nas aulas

Link para o comentário
Compartilhar em outros sites

3 horas atrás, giu_d disse:

Ele não pode fazer uso de funções como essa

Putz !!!

 

 

  • Pois então; no código vemos uma certa intenção que está corretíssima, o que não vejo nas escritas que têm muitos erros semáticos.

Ex.:

if(al[i].email=='@')

email vem sendo comparada diretamente com caractere está errado, em C sabemos que o "interpretador" não faz esse tipo de conversão, coisa que só vemos em linguagem de alto nível. Então antes de tudo tem que saber dessa coisas se não vai empaca toda vez.

"Sem falar que o editor sinaliza problemas desse tipo"

 

 

Valeu!

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

8 horas atrás, AnsiC disse:

Olá todos!

  • É difícil porque existem muitas coisas que pode fazer vários inválidos. Vejo situação de se perguntar; o que é um e-mail invalido? 

Concordo.

8 horas atrás, AnsiC disse:

Por exemplo @devair1010 nos diz o que é um e-mail válido 

Em 22/6/2018 às 05:34, devair1010 disse:

verifique se o email tem o arroba e se tem oito ou mais caracteres no inicio até o arroba e se tem o pontocom

Discordo :atirador:

8 horas atrás, AnsiC disse:

Basta buscas essas strings com a função strstr( ... )

Normalmente se trata de programas para estudo mas se a coisa for séria o problema é bem mais complexo. Da uma olhada aqui na sintaxes de um email: https://en.wikipedia.org/wiki/Email_address#Syntax

 

Tenho entendido que para validar emails uma boa estratégia seria usar Autômato finito determinístico, mas também é como matar moscas a canhão para esse enunciado >_<.

adicionado 1 minuto depois

Usar regex também n seria uma má ideia.

  • Curtir 2
  • Amei 1
Link para o comentário
Compartilhar em outros sites

Então ... com tudo que aprendi, eu mesmos respondo minha pergunta:

 

  • Daí me respondo:
21 horas atrás, AnsiC disse:

o que é um e-mail invalido? 

  1. Tem mais de um '@' ou nenhum
  2. Tem somente numerais ou nada nos extremos de '@'
  3. Tem 1 ou mais dots (.) em sequência ou seguido de '@'
  4. Tem parte local [antes do '@'] de tamanho maior que 64 caracteres
  5. Tem espaço "   "
  6. Não tem caixa de entrada.

 

  • Também pensei nisso com interesse porque seria um função ou subprograma muito útil
13 horas atrás, vangodp disse:

Usar regex também n seria uma má ideia.

 

  • Curtir 3
Link para o comentário
Compartilhar em outros sites

Email deve possuir: 3 caracteresou mais; um sinal de arroba (@); outros 3 caracteres ou mais; seguidos de um sinal de ponto final (.); e mais um conjunto de pelo menos 2 caracteres;
 

 

@giu_d

 

 

 

não funciona pra todas condições. Debuguei e ele pula a condição do @

#include <stdio.h>
#include <string.h>






main(){
	
	int x;
	char email[50]={"[email protected]"};
	int arroba,ponto,passa,maior,c_P,c_S,i;
	int tam=strlen(email);
	char teste='.';
	 for (i = 0; i < tam; i++) {
       if(email[i] > 3){   
		 maior=1;	
	   }if(email[i] == '@'){
	   	arroba=1;
	   	   	
	   }if(arroba == 1 &&  email[i] >= 3){
	  	c_P=1;
	   }if(email[i]=='.'){
	   		ponto=1;
		   }if(ponto=1 && email[i] >=2){
	   		c_S=1;
	   }
	
	if(maior==1 && arroba == 1 && c_P==1 && c_S ==1){
    	passa=1;
	}else{
		passa=0;
	}
		  	  
    
	}  
	
	if(passa==1){
		printf("Valido");
	}else{
		printf("Invalido");
	}
	
		
	
	}
	

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...
  • Vamos implementar solução com base em máscara de entrada. 
Em 26/06/2018 às 16:11, Igor Vargas disse:

Email deve possuir: 3 caracteresou mais; um sinal de arroba (@); outros 3 caracteres ou mais; seguidos de um sinal de ponto final (.); e mais um conjunto de pelo menos 2 caracteres;

/**                                                                           
 * programa ANSIC  --- Programa Validar e-Mail                                *
 * enconding: OEM 860, compilador: GCC 3.7.0  MinGW.org                       *
 * [MSC v.6.3.0-1 32b (AMD6 4)] on win32 editor: Notepad++ 7.5.7 32 32 bits   *
 * OS: win7 64 bits                                                           *
 * file: email.c                                                 ver: 1.0.0   *
 */

/* INCLUSOES                                                                  */
#include <stdio.h>

/* DEFINICOES                                                                 */
#define false 0
#define true  1
  
/* FUNCOES                                                                    */
/* chbuscar --- retorna a posição do elemento no vetor de tipos char          */
int chbuscar(const int siz, const char base[siz], const char elem)
{
    for (int e = 0; e < siz; e += 1) {
        if (elem == base[e])
        {   return e;}
    }
    return -1;
}

/* pegemail --- devolve 1 se a entrada for de um e-mail válido, 0 se não      */
char validemail(char email_[], int limit)
{
/* TIPOS LOCAIS                                                               */
    char a = 0;               /* Contém a próxima do @ no e-mail              */
    char p = 0;               /* Contém p próxima do ponto no e-mail          */
    char t = 0;               /* Contém t próxima do segundo teste            */
    char s = 0;               /* Contém s o tamanho da string e-mail          */

/* PROCESSAMENTO                                                              */
    s = chbuscar(limit, email_, '\0'); /* ?Mesmo com limite ainda busca saber o
    tamanho real do string na memória.                                        */ 
    a = chbuscar(s, &email_[t], '@');  /* ?Determinar agora a próxima onde se vΩ
    a primeira ocorrΩncia, e única de uma arroba, e guarda na memória         */
    if (2 < a) { /* ?Se a próximo @ maior que 2 então existe string antes de a
    que satisfaz a condição de e-mail válido                                  */
        if (email_[a + 1] == '.' || email_[a - 1] == '.') /* ?Ainda é preciso sa
        ber se existe pontos depois e antes do primeiro e talvez único arroba se
        não existir arroba entre pontos então devemos continua nos  testes    */
        {   return false;}
        t = chbuscar(s - (a), &email_[1 + (a)], '@'); /* ?Agora buscamos outra
        ocorrência de arroba, para isso subtraiu   do limite a posição de    @
        e posicionamos o endereço da memória no próximo valor depois de arroba
        e pesquisamos mais uma vez pelo @      na memória                     */
        if (0 <= t) /* ?Se t for maior ou igual a 0 é porque encontrou mais uma
        ocorrência de arroba, finalizando a buscar, se não continua os testes */
        {   return false;}
        p = chbuscar(s - (a), &email_[1 + (a)], '.'); /* ?Agora buscamos por um
        ponto depois do arroba, nisso passamos o limite como sendo a próximo de
        arroba menos o tamanho do string, e o endereço imediatamente após arro-
        ba, e buscamos o ponto                                                */        
        if (p < 2) /* ?Se a posição do ponto for menor que 2 significa que não
        existe entre o @ e ponto o limite mínimo de 3 caracteres, daí retorna
        falso, se não então continua buscando outra ocorrencia de ponto      */
        {   return false;}
        t = chbuscar(s - (1 + (a + p)), &email_[2 + (a + p)], '.'); /* ?Procura 
        uma vez pelo ponto em busca de ocorrências repetidas, o limite da busca
        agora é a diferença de @ e .       o que sobra da string, se existir ou-
        ponto então não é o email válido                                      */
        if (0 <= t) /* ?Se t é maior ou igual a 0 então encontrou pontos depois
        de ponto, log esse email tem 2 ou mais ponto, é inválido             */
        {   return false;}
        t = chbuscar(s - (1+ (a + p)), &email_[2 + (a + p)], '\0'); /* ?Por fim
        buscamos pelo fim da string começando da única ocorrência de ponto, se*/
        if (1 < t) /* t for maior 1 então existe pelo menos 2 caracteres depois
        de ponto, por fim se nada der errado acima, o e-mail é válido         */
        {   return true;}
    }
/* FIM */
    return false;
}

/* main --- função principal do programa                                      */
int main(void)
{
/* TIPOS LOCAIS                                                               */
    char email[120] = {"[email protected]"};
/* RESULTADO                                                                  */
    printf("%d\n", validemail(email, 120));
/* FIM                                                                        */
  return 0;
}

 

Versão sem Texto

/**                                                                          **                                                       
 * programa ANSIC  --- Programa Validar e-Mail                                *
 * enconding: OEM 860, compilador: GCC 3.7.0  MinGW.org                       *
 * [MSC v.6.3.0-1 32b (AMD6 4)] on win32 editor: Notepad++ 7.5.7 32 32 bits   *
 * OS: win7 64 bits                                                           *
 * file: email.c                                                 ver: 1.0.0   *
 */

#include <stdio.h>

#define false 0
#define true  1

int chbuscar(const int siz, const char base[siz], const char elem)
{
    for (int e = 0; e < siz; e += 1) {
        if (elem == base[e])
        {   return e;}
    }
    return -1;
}
char validemail(char email_[], int limit)
{
    char a = 0;
    char p = 0;
    char t = 0;
    char s = 0;

    s = chbuscar(limit, email_, '\0');
    a = chbuscar(s, &email_[t], '@');
    if (2 < a) {
        if (email_[a + 1] == '.' || email_[a - 1] == '.')
        {   return false;}
        t = chbuscar(s - (a), &email_[1 + (a)], '@');
        if (0 <= t)
        {   return false;}
        p = chbuscar(s - (a), &email_[1 + (a)], '.');        
        if (p < 2)
        {   return false;}
        t = chbuscar(s - (1 + (a + p)), &email_[2 + (a + p)], '.');
        if (0 <= t)
        {   return false;}
        t = chbuscar(s - (1 + (a + p)), &email_[2 + (a + p)], '\0');
        if (1 < t)
        {   return true;}
    }
  return false;
}
int main(void)
{
  char email[120] = {"[email protected]"};
  printf("%d\n", validemail(email, 120));
  return 0;
}

Dúvidas, sugestão e críticas?

  • Curtir 3
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...