Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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;
	
		
		}		
			  
	} 	
			
}

 

Editado por Igor Vargas

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

 

Editado por giu_d
corrigir comentário
  • 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

Editado por Igor Vargas
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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!

Editado por giu_d
corrigir comentário
  • 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

@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

Editado por giu_d
  • 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

@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

Editado por Igor Vargas
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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?

Editado por giu_d
corrigir comentário

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d Verificar só se tem o ponto mas tem a parte do "com ou br " depois.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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

Editado por giu_d
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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






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

×