Ir ao conteúdo
  • Cadastre-se

C Comparador de strings strcmp()


RenanMaia
Ir à solução Resolvido por devair1010,

Posts recomendados

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
Link para o comentário
Compartilhar em outros sites

  • Solução

@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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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

 

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!