Ir ao conteúdo
  • Cadastre-se

Como comparar char com char em linguagem C?


WBlacker

Posts recomendados

Sou iniciante em linguagem C e queria saber se tem como comparar uma variável char com outra char, pois estou tentando fazer uma fomulário muito simples em que se digita a senha e depois a confirmação da senha, e com um if queria comparar as duas para avisar se estão diferentes.

E já aproveitando queria saber se tem como aparecer *(asteriscos) na senha quando a pessoa estiver digitando. Desde já Agradeço.

Código:

#include <stdio.h>
#include <stdlib.h>

main()
{
char nome[100], email[100], senha[100], confsenha[100];

printf("Digite o nome do seu usuario: ");
scanf("%s",&nome);
printf("Digite seu email: ");
scanf("%s", &email);
printf("Digite sua senha: ");
scanf("%s", senha); //como trocar o senha por *
printf("Confirme a senha: ");
scanf("%s", &confsenha);

if(confsenha!= senha){ //Da forma que eu coloco sempre da mostra o printf
printf("A confirmacao nao corresponde a senha.");

}
else{
printf("Formulario concluido.");
}
system("pause>null");
}

Link para o comentário
Compartilhar em outros sites

Em C, o tipo "char" armazena apenas um carácter. Quando criamos um vetor desse tipo, e pretendemos armazenar palavras/frases, chamamos de string, que possui um tratamento mais específico.

Para fazer comparações entre strings, usa-se a função "strcmp()", onde retornará valor 0 (zero), caso sejam iguais.

Exemplo:


char palavra1[100] = "teste";
char palavra2[100] = "teste";

if ( strcmp(palavra1, palavra2) == 0 )
printf("Sao iguais!");

Função que faz leitura de senha:


void readPassword( char *password, int strSize )
{
int i = 0;

for( i = 0; i < strSize-1; i++ )
{
password[i] = getch();

if( password[i] == '\r' )
break;
else
printf("*");
}
password[i] = '\0';
}

O parâmetro "strSize" recebe o valor do tamanho comportado pelo vetor de char, e a função "getch()" faz parte da biblioteca "conio.h".

Link para o comentário
Compartilhar em outros sites

Estouro de buffer é pra funções que lêem strings diretamente e não possuem tratamento de tamanho.

No exemplo que postei, a leitura não é de string, mas sim, carácter por carácter, tendo o controle e tratamento de leitura.

Além disso, leitura de string não permite ocultar o texto da tela e mostrar asteriscos no lugar, como faz a função postada acima.

Link para o comentário
Compartilhar em outros sites

Só usar o strcmp como o ScreenBlack falou.

Outra coisa, sempre que pegar uma string do teclado, lembre-se de limpar o buffer do teclado usando o fflush(stdin) evitando que algum "lixo" apareça na tela.

Para isto basta fazer assim:


scanf("%s",&variavel);
fflush(stdin);

Falou

Link para o comentário
Compartilhar em outros sites

Não se usa "fflush()" para buffer de entrada, pois ela foi feita pra limpar apenas buffer de saída (stdout). Nem sempre funcionará.

Para evitar que mantenha lixo no buffer, use uma das seguintes técnicas abaixo:


scanf("%s%*c", variavel); // Caso de string, não precisa do '&'

ou

scanf(" %s", variavel); // Espaço antes da máscara "%s"

Link para o comentário
Compartilhar em outros sites

Realmente, isso (stdin) é buffer de entrada.

Porém, sinto lhe dizer que, seu professor está equivocado em dizer que sempre deve usar essa função.

A função "fflush()" foi criada, para limpar buffer de saída (stout / stderr) ou atualizações delas. Nos demais casos, poderá haver comportamento indefinido.

Vejamos o que diz na documentação oficial ISO/IEC 9899:TC3, paragrafo 7.19.5.2/2:

"If stream points to an output stream or an update stream in which the most recent operation was not input, the fflush function causes any unwritten data for that stream to be delivered to the host environment to be written to the file; otherwise, the behavior is undefined."
Link para o comentário
Compartilhar em outros sites

Em todos os testes que fiz, sendo ponteiro ou não, na variável recebida, sempre funcionou.

Sobre o fflush, depende da utilização. Há situações em que ele, realmente, não funciona.

Já aconteceu comigo. Se não me engano, foi implementando árvore binária.

Além disso, tem a questão de não ser portável, o seu comportamento.

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

ScreenBlack, estou tentando fazer o seu código de senha em C++, mas não está dando certo.

 

Olha o que eu fiz? O que deveria ser melhorado?

 

Tive alguns problemas, mas já foram sanados, só a comparação não está funcionando.

 

Poderia usar o xxxx.compare() != 0 mas como estou aprendendo C++ gostaria de fazer do estilo que fiz neste momento.

 

 

 

do		{			cout << "Set a password (only letters, maximum of 10): ";			int i = 0;			for (i; i < sizepass - 1; i++)			{				passw[i] = _getch();				if (passw[i] == '\r')					break;				else					cout << "*";			}			passw[i] = '\0';			cout << passw << "0" << endl;//somente para saber o que foi armazenado						cout << "Type the password again: ";			int j = 0;			for (j; j < sizepass - 1; j++)			{				passw1[j] = _getch();				if (passw1[j] == '\r')					break;				else					cout << "*";			}			passw1[j] = '\0';			cout << passw1 << "1" << endl;//somente para saber o que foi armazenado		} while (passw != passw1);
Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!