Ir ao conteúdo

Como comparar char com char em linguagem C?


WBlacker

Posts recomendados

Postado

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");
}

Postado

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

Postado

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.

Postado

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

Postado

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"

Postado

ScreenBlack, como assim não usa fflush para entrada?

Por exemplo, o usuário digita uma string no teclado e logo depois outra. Isso não é buffer de entrada?

Porque meu professor sempre manda usar fflush(stdin) nesses casos

Postado

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

Screen,

No segundo exemplo que você postou acima (para limpar o buffer), com espaço antes da máscara, sempre funciona?

Em relação a fflush stdin funcionar, acho que depende da implementação do compilador. Portanto não é portável.

Postado

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.

  • 1 ano depois...
Postado

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);

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