Ir ao conteúdo
  • Cadastre-se
Igor Vargas

C Validando um email e como procurar por nome

Recommended Posts

Estou terminando um trabalho e falta algumas coisas. Queria saber a opinião de vocês nessas questões.

1. Preciso validar um email ele tem que ter um @ nao pode ter menos de 2 letras no inicio e dever ter um  ponto final.

2. Também preciso achar um aluno pelas 3 primeiras letras do nome dele.

No código abaixo ele esta comparando o nome inteiro. 

 

 

printf("Digite o nome do aluno:");	
	fflush(stdin);
	gets(nome);
	for(x=0; x<4; x++){
		if(strcmp(al_C[x].nome, nome)==0){	

			salva_V=1;
	
		
		}		
			  
	} 	
			
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Igor Vargas Olá. Quanto a validar o e-mail recomendo trabalhar com índices da string referente ao e-mail. 

Primeiro verifique se o '@' está no e-mail e guarde esse índice. Feito isso verifique se os dois índices anteriores ao índice onde está o '@' são diferentes de espaço. Para finalizar, verifique se o último índice da string (e-mail), antes do '\0', é igual ao ponto

Quanto as três primeiras letras do nome a mesma coisa. Armazene essas três letras em uma string auxiliar e depois verifique se os três primeiros índices da string auxiliar são iguais aos três primeiros índices da string referente ao nome

algo assim:

letra[i] == nome[i] && letra[i + 1] == nome[i + 1] && letra[i + 2] == nome[i + 2]

Para fazer a verificação acima use um for que percorra todos os índices do nome 

Também daria para tentar fazer uso da função strstr, que verifica a ocorrência de uma substring em uma string

adicionado 21 minutos depois

@Igor Vargas Segue um pequeno exemplo da função strstr da biblioteca <string.h>:

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

int main() {
    char nome[] = "Manuel";
    char subString[] = "Man";
    char *result = strstr(nome, subString);
    if (result != NULL) {
        printf("%s\n", nome);
    }
    return 0;
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu tentei fazer o que você falou.

O nome não funcionou aqui.

printf("Digite o nome do aluno:");
char string[3];
	fflush(stdin);
	gets(nome);
	for(x=0; x<4; x++){
	string[x]=nome;
		if(string[x] == al_C[x].nome && string[x+1] == al_C[x+1].nome && string[x+1] == al_C[x+1].nome){
			salva_V=1;
		}

O email fiz uma parte mas n entendi o resto.

printf("Digite seu e-mail:");
        fflush(stdin);
        gets(al[cont].email);
       	for(x=0; x<strlen(al[cont].email); x++){
       		if(al[x].email=='@'){
       			passa++;
			   }if(al[passa-2].email!=' '){
			   	
			   }
		   }

Faz poucos meses que estou programando tem muita coisa que não assimilei direito. @giu_d

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Igor Vargas Segue uma alternativa para o nome usando a função q mencionei:

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

int main() {
    char nomeArmazenado[] = "Joaquin";
    char nome[40];

    printf("Nome: "); // aqui digita as três primeiras letras
    scanf("%3s", nome); // %3s é para ler 3 letras apenas    

    char *result = strstr(nomeArmazenado, nome);
    if (result)
        printf("%s\n", nomeArmazenado);
    else
        printf("Nao encontrado!\n");

    result = NULL;

    return 0;
}

Essa forma acima me parece interessante de ser usada no seu código

 

Segue uma forma de validar o e-mail:

char email[] = "te@gmail.com";
int i;

for (i = 0; i < strlen(email); i++) {
    if (email[i + 2] == '@' && email[i + 1] != ' ' && email[i] != ' ') {
        printf("Validado!");
    }
}

Teste aí amigo. Fiz correndo tudo isso hehe

 

adicionado 0 minutos depois

quanto ao e-mail ficou a questão do ponto

Dá para colocar mais essa condição no e-mail. Só não sei se é no final do e-mail ou tipo .com

Se é no final seria isso mais essa condição no if: email[strlen(email) - 1] == '.'

adicionado 33 minutos depois

Por hoje tá bom amigo. Nesse domingão, se Deus permitir, a gente conclui esse exercício.

abraço!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é que o mesmo scanf que eu uso pra digitar o nome normal seria o mesmo que eu teria que pegar as 3 primeiras letras do nome e compara com o nome que esta guardado no struct para printar uma grade de horário.

 

Quanto ao email se eu fizesse uma condição assim funcionaria? @giu_d

if(strcmp(email[x],".com")==1 ||strcmp(email[x],".br")==1 || strcmp(email[x],"hotmail")==1 || strcmp(email[x],"yahoo")==1||  strcmp(email[x],"gmail")==1  || email[x] <2){
printf("Email invalido");

}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Igor Vargas Olá. A função strcmp faz a comparação entre duas string. Percebe q dessa forma q você está fazendo, está comparando um caractere com uma string. Devido a isso dá erro ao executar o programa

 

quanto ao nome não é obrigatário colocar o %3s, pode deixar só o %s. Mas aí só vai dar certo se o usuário digitar as três primeiras letras apenas

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema pra mim é que não posso usar

*result = strstr

porque não aprendi isso em aula e o professor é meio rigido nesse quesito de usar só o que é aprendido em aula. Estou tentando outras formas mas nenhuma deu certo ainda

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Igor Vargas Entendi. Você pode fazer assim:

char nomeArmazenado[] = "Joaquin";
char nome[40];

printf("Nome: "); // aqui digita as três primeiras letras
scanf("%s", nome);    

if (strstr(nomeArmazenado, nome) != NULL)
    printf("%s\n", nomeArmazenado);
else
    printf("Nao encontrado!\n");

Não é preciso fazer uso de um ponteiro. Use essa função strstr tal como usaria a função strcmp 

adicionado 13 minutos depois

Outra sugestão q eu daria seria trabalhar com índices ao invés de usar essa função. Tal como mencionei no início do tópico. 

O importante é entender bem o q está sendo feito:

char nome[] = "Joaquin";
char letras[50]; // aqui pode usar qualquer nome. Estou usando o nome letras
int i;

printf("Nome: "); // aqui digita as três primeiras letras
scanf("%s", letras);

for (i = 0; i < strlen(nome); i++) {
    if (nome[i] == letras[i] && nome[i + 1] == letras[i + 1] && nome[i + 2] == letras[i + 2]) { //nessa linha são comparadas as 3 letras
        printf("nome encontrado");
    }
}

Mas claro. O q estou fazendo é apenas dando sugestões para resolver o problema.

adicionado 22 minutos depois

Daria para simplificar e fazer assim:

if (nome[0] == letras[0] && nome[1] == letras[1] && nome[2] == letras[2]) {
    printf("nome encontrado");
}

Só teste bem essa forma q passei agora. Fica bem mais simples assim. Na verdade é a mesma coisa. Estou comparando os índices do 'nome' com os índices da 'letras'

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deu certo a questão do nome ahah valeu.

Agora sobre o email

char email[] = "te@gmail.com";
int i;

for (i = 0; i < strlen(email); i++) {
    if (email[i + 2] == '@' && email[i + 1] != ' ' && email[i] != ' ') {
        printf("Validado!");
    }
}

Falta o .com ou .br estou pensando em fazer um vetor e colocar os nomes tipo @hotmail ou gmail dentro e depois comparar ele com o email inscrito. @giu_d

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Igor Vargas

13 minutos atrás, Igor Vargas disse:

estou pensando em fazer um vetor e colocar os nomes tipo @hotmail ou gmail dentro e depois comparar ele com o email inscrito

Té daria. Mas aí você cai na questão de ter q usar a função strcmp, que compara a e-mail todo.

É preciso verificar se é .com ou .br ou só se tem o ponto?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Igor Vargas Té daria para usar a mesma lógica do nome. No for você está verificando se tem o '@' por exemplo e se os dois índices anteriores são diferentes de espaços.

Daria para usar um outro for para essa parte do ponto. Verificar se tem o ponto e se os índices seguinte são iguais a 'com' ou iguais a 'br'. Ficaria um if bem grande, ou daria para usar dois if dentro do for, um para '.com' e outro para '.br'

 

Mas veja como ficaria fácil com a função strstr:

if (strstr(email, ".com")) || strstr(email, ".br")) { // aqui é o mesmo q fazer ((strstr(email, ".com") != NULL)
    printf("Validado");
}

Daria para colocar essas condições no mesmo for ou até no mesmo if

adicionado 11 minutos depois

Ou assim. Trabalhando com índices:

for (i = 0; i < strlen(email); i++) {
    if (email[i] == '.' && email[i + 1] == 'c' && email[i + 2] = 'o' && email[i + 3] == 'm') { // nesse if verifico o .com
        // ok
    }
}

Fica a seu critério qual forma usar. Se gostou de alguma apresentada, claro. Vou procurar pensar em outra maneira

adicionado 54 minutos depois

@Igor Vargas Veja como ficaria se usar um só if:

for (i = 0; i < strlen(email); i++) {
    if (email[i + 2] == '@' && email[i + 1] != ' ' && email[i] != ' ' && email[strlen(email) - 1] == '.' ||
        (strstr(email, ".com") || strstr(email, ".br"))) {
             printf("Validado!");
             break;
    }
}

Ficou até q bem "complexo" o if dessa forma, mas funciona. O ideal seria fazer uso de 2 if. 1 para os índices e outro para a função

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Igor Vargas Procure entender bem o q está sendo feito. Primeiramente é importante saber q uma string em C é um vetor de char (vetor de caracteres) ou cadeia de caracteres. Sendo uma string um vetor, ela também é indexada. O 1º índice é 0 o 2º é 1 etc... 

No caso do nome fica fácil saber os índices que precisamos comparar: índices 0, 1 e 2.

Mas no caso do e-mail, não tem com saber em q índice da string está o '@' e também não tem como saber em q índice está o '.' (ponto). Devido a isso é usado o for para navegar por todos os índices da string e-mail e poder verificar em q índice da string está o '@' por exemplo. Está conseguindo entender essa parte?

Quanto a função strstr o q ela faz é verificar a ocorrência de uma substring dentro de uma string. Por exemplo: a string é "Joaquim". Nesse caso, a substring 'quim' está dentro da string 'Joaquim". 

Caso tiver dúvidas pergunte.

Mas quanto ao e-mail me parece mais interessante usar os índices para verificar o ponto e depois as letras:  .com ou .br

Mas o importante mesmo é entender bem o q está sendo feito

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu entendi essa parte só não conhecia o strstr . tenho aula hj e verei se posso usar, qualquer coisa eu volto aqui haha mas valeu pela paciência @giu_d

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×