Ir ao conteúdo

C Comparador de strings strcmp()


Ir à solução Resolvido por devair1010,

Posts recomendados

Postado

Olá, comecei a aprender a programar a pouco tempo, e resolvi criar um programa simples que pedia em um livro que estou lendo, acontece que sempre que aprendo algo novo quero desenvolver dentro deste programa. o meu problema atual é em uma comparação de strings! estou tentando fazer uma senha que quando digitada apareça asteriscos e até que está dando certo, mas o problema é que na hora de fazer o login mesmo a senha estando errada, ela passa pelo meu loop que tem como Parâmetros o enter e a função "strcmp()" que compara a senha registrada com a que foi digitada já tentei de tudo, alguém pode me ajudar? segue o código.

 

ps: O código não está pronto! falta arrumar a parte "Poblemas Mecanicos".

ps2: Por favor, me perdoem qualquer erro como indentação, falta de comentarios, entre outros. como eu disse comecei a pouco tempo!

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

#define ANO 2018

int main()
{
    int cont, i, opcao, problema, poblema_motor, poblema_freio, poblema_suspencao;
    float orcamento_motor[2], orcamento_freio[2], orcamento_suspencao[2];;

    while (opcao < 1 || opcao >3 || opcao > 'a' || opcao < 'z')
    {
        puts("==================");
        puts(" OFICINA MECANICA ");
        puts("==================");
        puts("-------------------");
        puts("       MENU        ");
        puts("1 - Poblemas mecanicos");
        puts("2 - Fale conosco");
        puts("3 - Cadastre-se");
        puts("4 - Entre");
        puts("5 - Sair");
        puts("-------------------");
        scanf("%d", &opcao);

    switch (opcao)
    {
        case 1:

        // limpando a tela

        system("cls");

        puts("==================");
        puts(" OFICINA MECANICA ");
        puts("==================");
        puts("-------------------");
        puts("POBLEMAS MECANICOS");
        puts("indique onde se encontra o seu problema: ");
        puts("1 - Motor");
        puts("2 - Freios");
        puts("3 - Suspencao");
        scanf("%d", &problema);

            switch (problema)
            {
                case 1:

                    // limpando a tela

                    system("cls");

                    puts("==================");
                    puts(" OFICINA MECANICA ");
                    puts("==================");
                    puts("-------------------");
                    puts("       MOTOR       ");
                    puts("Indique qual seu problema com o motor: ");
                    puts("1 - Falta de potencia");
                    puts("2 - Baixo rendimento com gasolina");
                    puts("3 - Motor acelerado");
                    scanf("%d", &poblema_motor);

                        switch (poblema_motor)
                        {
                            case 1:
                                orcamento_motor[0] = 100.00;
                                break;
                            case 2:
                                orcamento_motor[1] = 200.00;
                                break;
                            case 3:
                                orcamento_motor[2] = 300.00;
                                break;
                            default:
                                printf("\n \a Opcao invaida!");
                        }
                        break;
                case 2:

                    // limpando a tela

                    system("cls");

                    puts("==================");
                    puts(" OFICINA MECANICA ");
                    puts("==================");
                    puts("-------------------");
                    puts("       FREIOS       ");
                    puts("Indique qual seu problema com os freios: ");
                    puts("1 - chiado ao precionar o freio");
                    puts("2 - o carro nao para ao precionar o freio");
                    puts("3 - mal cheiro ao precionar o freio");
                    scanf("%d", &poblema_freio);

                        switch (poblema_freio)
                        {
                            case 1:
                                orcamento_freio[0] = 100.00;
                                break;
                            case 2:
                                orcamento_freio[1] = 200.00;
                                break;
                            case 3:
                                orcamento_freio[2] = 300.00;
                                break;
                            default:
                                puts("\a opcao invalida!\n\n");
                                break;
                        }
                        break;
                case 3:

                    // limpando a tela

                    system("cls");

                    puts("==================");
                    puts(" OFICINA MECANICA ");
                    puts("==================");
                    puts("-------------------");
                    puts("      SUSPECAO     ");
                    puts("Indique qual seu problema com a suspencao: ");
                    puts("1 - Barulhos ao passar por buracos");
                    puts("2 - Assoalho raspando em lombadas");
                    puts("3 - Troca compreta de jogo de suspencoes");
                    scanf("%d", &poblema_suspencao);

                        switch (poblema_suspencao)
                        {
                            case 1:
                                orcamento_suspencao[0] = 100.00;
                                break;
                            case 2:
                                orcamento_suspencao[1] = 200.00;
                                break;
                            case 3:
                                orcamento_suspencao[2] = 300.00;
                                break;
                            default:
                                puts("\a opcao invalida!");
                                break;
                        }
                    break;
                default:
                    puts("\a opcao invalida!");
            }
            break;
        case 2:

            ////////////////////////////CONTATOS///////////////////////////////////

            system("cls");

            puts("==================");
            puts(" OFICINA MECANICA ");
            puts("==================");
            puts("-------------------");
            puts("      CONTATOS     ");
            putchar('\n');
            puts("Whasapp: 11 00000000");
            puts("Facebook: facebook.com/teste");
            puts("Email: [email protected]");
            break;
        case 3:

            //////////////////////////CADASTRO DE USUARIO/////////////////////

            system("cls");

            puts("==================");
            puts(" OFICINA MECANICA ");
            puts("==================");
            puts("-------------------");
            puts("     CADASTRO      ");

            struct cadastro
            {
                char primeiro_nome[15];
                char segundo_nome[15];
                char email[30];
                char senha;
                char salva_senha[15];
                char cpf[15];
                char cidade[20];
                char rua[20];
                char numero[10];
                int idade;
            }usuario, endereco;

            struct data
            {
                int dia, mes, ano;
            }aniversario;

            putchar('\n');
            puts("   Dados pessoais  ");
            puts("-------------------");
            putchar('\n');
            puts("Digite seu nome: ");
            scanf("%s", usuario.primeiro_nome);
            puts("digite seu ultimo nome: ");
            scanf("%s", usuario.segundo_nome);
            puts("digite seu email: ");
            scanf("%s", usuario.email);

            // colocando asterisco na senha

            puts("digite uma senha de 10 digitos: ");


                i = 0;
                fflush(stdin);
                do
                {
                    usuario.senha = getch();
                    if (isalnum(usuario.senha))
                    {
                        usuario.salva_senha[i] = usuario.senha;
                        i++;
                        putchar('*');
                    }
                    else if(usuario.senha == 8 && i) //8 é o caractere BackSpace na tabela ASCII, && a analisa se a é diferente de 0
                    {
                        usuario.salva_senha[i]='\0';
                        i--;
                        printf("\b \b");       //Apagando o caractere digitado
                    }

                }while (usuario.senha != 13);
                usuario.salva_senha[i] = '\0';
                putchar('\n');
            puts("Digite seu cpf: ");
            scanf("%s", usuario.cpf);
            putchar('\n');
            puts("Data de nascimento ");
            puts("-------------------");
            putchar('\n');
            puts("Dia: ");
            scanf("%d", &aniversario.dia);
            puts("mes: ");
            scanf("%d", &aniversario.mes);
            puts("ano: ");
            scanf("%d", &aniversario.ano);
            putchar('\n');
            puts("     Endereco:     ");
            puts("-------------------");
            putchar('\n');
            fflush(stdin);
            puts("Digite o nome da sua cidade: ");
            fgets(endereco.cidade, 20, stdin);
            puts("Digite o nome da sua rua: ");
            scanf("%s", endereco.rua);
            puts("Digite o numero da sua casa: ");
            scanf("%s", endereco.numero);

            //limpando a tela

            system("cls");

            // Deixando iniciais maiusculas
            usuario.primeiro_nome[0] = toupper(usuario.primeiro_nome[0]);
            usuario.segundo_nome[0] = toupper (usuario.segundo_nome[0]);
            endereco.cidade[0] = toupper (endereco.cidade[0]);
            endereco.rua[0] = toupper (endereco.rua[0]);

            //definindo idade

            usuario.idade = ANO - aniversario.ano;

            //exibindo informações
            putchar('\n');
            printf("------------------------------\n");
            printf("    informações do cadastro   \n");
            printf("------------------------------\n");
            printf("Nome: %s %s\n", usuario.primeiro_nome, usuario.segundo_nome);
            printf("cpf: %s\n", usuario.cpf);
            printf("Data de nascimento: %d/%d/%d\n", aniversario.dia, aniversario.mes, aniversario.ano);
            printf("idade: %d\n", usuario.idade);
            printf("endereco: %s, Rua %s, %s\n", endereco.cidade, endereco.rua, endereco.numero);
            printf("------------------------------\n");

            printf("\n");

            break;

        case 4:

            ////////////////////////////   LOGIN DO USUARIO ///////////////////////////////

            system("cls");

            puts("==================");
            puts(" OFICINA MECANICA ");
            puts("==================");
            puts("-------------------");
            puts("       ENTRE       ");

            struct entre
            {
                char confirma_email[30];
                char confirma_senha[15];
            };
            struct entre login;

            putchar('\n');

            i = 0;
            do
            {
                fflush(stdin);
                printf("Digite seu email: ");
                scanf("%s", login.confirma_email);
                if (strcmp(usuario.email, login.confirma_email) != 0)  //CONFERE EMAIL
                {
                    printf("\a Email invalido!\n");
                }

            }while(strcmp(usuario.email, login.confirma_email) != 0);

            printf("Digite sua senha: ");
            fflush(stdin);
            do{

                   usuario.senha = getch();
                   if(isprint(usuario.senha)) //Analisa se o valor de c é imprimível
                    {
                        login.confirma_senha[i] = usuario.senha;
                        i++;
                        printf("*");      //Imprimindo apenas o asterisco *
                    }
                   else if( usuario.senha == 8 && i )
                    {
                        login.confirma_senha[i] = '\0';
                        i--;
                        printf("\b \b");     //Apagando os caracteres digitados
                    }

                    if(usuario.senha == 13 && strcmp(login.confirma_senha, usuario.salva_senha) != 0)
                    {
                        fflush(stdin);
                        putchar('\n');
                        printf("\a Senha invalida!\n");
                        for(cont = 0; cont <= 15; cont++)
                        {
                            login.confirma_senha[cont] = '\0';
                        }
                        printf("Digite sua senha: ");
                    }

               }while(usuario.senha != 13 && strcmp(login.confirma_senha, usuario.salva_senha) != 0);
               usuario.senha = '\0';


               printf("\nBem Vindo, %s!\n", usuario.primeiro_nome);


            break;

        case 5:

            // limpando a tela
            system("cls");

            // função que sai do programa
            exit(0);

            break;

        default:

            putchar('\n');
            printf("\a opcao invalida!\n");

            break;
    }

    }


    return 0;
}

 

  • Curtir 1
  • Solução
Postado

@RenanMaia      na opção 4 depois de pegar os caracteres da senha você faz as comparações para ver se está certo, mas no final do loop lá no while você colocou se uma    e     a outra informação for diferente :

}while(usuario.senha != 13 && strcmp(login.confirma_senha, usuario.salva_senha) != 0);

   mas teria que ser se uma ou outra informação for diferente assim :

}while(usuario.senha != 13 || strcmp(login.confirma_senha, usuario.salva_senha) != 0);

e também algumas modificações, e essa opção 4 ficaria assim :

case 4:

           /*////////////////////////////   LOGIN DO USUARIO ///////////////////////////////*/

            system("cls");

            puts("==================");
            puts(" OFICINA MECANICA ");
            puts("==================");
            puts("-------------------");
            puts("       ENTRE       ");

            struct entre
            {
                char confirma_email[30];
                char confirma_senha[15];
            };
            struct entre login;

            putchar('\n');

            i = 0;
            do
            {
                fflush(stdin);
                printf("Digite seu email: ");
                scanf("%s", login.confirma_email);
                if (strcmp(usuario.email, login.confirma_email) != 0) /* //CONFERE EMAIL*/
                {
                    printf("\a Email invalido!\n");
                }

            }while(strcmp(usuario.email, login.confirma_email) != 0);

            printf("Digite sua senha: ");
            fflush(stdin);
            do{

                   usuario.senha = getch();
                   if(isprint(usuario.senha)) /*//Analisa se o valor de c é imprimível*/
                    {
                        login.confirma_senha[i] = usuario.senha;
                        i++;
                        printf("*");      /*//Imprimindo apenas o asterisco **/
                    }
                   else if( usuario.senha == 8 && i )
                    {
                        login.confirma_senha[i] = '\0';
                        i--;
                        printf("\b \b");   /*  //Apagando os caracteres digitados*/
                    }
                    if(usuario.senha == 13)
                    {
                        login.confirma_senha[i]='\0';
                        if(strcmp(login.confirma_senha, usuario.salva_senha) != 0)
                        {
                            i=0;
                            fflush(stdin);
                            putchar('\n');
                            printf("\a Senha invalida!\n");
                            for(cont = 0; cont <= 15; cont++)
                            {
                                login.confirma_senha[cont] = '\0';
                            }
                            printf("Digite sua senha: ");
                        }
                    }

               }while(usuario.senha != 13 || strcmp(login.confirma_senha, usuario.salva_senha) != 0);
               usuario.senha = '\0';


               printf("\nBem Vindo, %s!\n", usuario.primeiro_nome);


            break;

 

  • Amei 1
Postado

Noooosa, funcionou obrigado de verdade! faz mais de umas 4 horas que eu to batendo cabeça com isso e não acho uma solução!

mas eu sinceramente ainda n entendi o porque de mudar o && pelo ||. porque tipo, pro loop parar não era necessario que os parametros fossem tanto o enter quanto a senha correta para para? mas mesmo não tendo intendido muito obrigado você é d+.!!!

  • Curtir 1

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!