Ir para conteúdo
Fórum Script Brasil

Blitzen

Membros
  • Total de itens

    14
  • Registro em

  • Última visita

Sobre Blitzen

Blitzen's Achievements

0

Reputação

  1. Em primeiro lugar você tem que incluir na variável PATH o caminho 'c:\dev-cpp\bin' (Win7 - Computador->Propriedades->Configurações avançadas do sistema->Variáveis de Ambiente->Novo...). Depois, abre um console e compila o código. Abraços.
  2. É um trabalho da faculdade em C em que tenho que fazer a autenticação de usuários com o crypt() e o MD5. Quando tento comparar as strings armazenadas no arquivo e a calculada com a senha fornecida pelo usuário, mesmo passando os dados corretos, o código não consegue "autenticar", isto é, ele compara as strings iguais e diz que são diferentes. Pelamordedeus, alguém me dê uma luz, porque não consigo achar a m&*#@ do erro. Vlw. ps: para compilar, acrescente -lcrypt ;) /* * CABEÇALHOS */ #include <stdio.h> /* getchar(), fgets() */ #include <stdlib.h> /* system() */ #include <unistd.h> /* crypt(), getpass() */ #include <string.h> /* strlen(), strcpy(), strcat() */ #include <errno.h> /* perror() */ #include <time.h> /* time() */ /* * DEFINIÇÕES * */ #define TAM_SENHA 30 #define TAM_SALT 15 #define TAM_MAX 50 #define TAM_BUF 1024 #define SIM 1 #define não 0 /* simulando o tipo booleno */ typedef enum Boolean{ false=0, true=1 } bool; /* * PROTÓTIPOS */ void menuPrincipal(); void concatenar( char *buffer, char *nome, char *login, char *senhaHash ); void guardarSenha( char *buffer ); void cadastrar(); void autenticar(); void colherDados( char *nome, char *login, char *senhaTextoClaro, int autenticacao ); void verificarSeCadastrado( char* loginDigitado, char* senhaHash, bool *status ); int compara( const char* str1, const char* str2 ); void listar(); int main() { /* chama o menu principal */ menuPrincipal(); return(0); } int compara( const char* str1, const char* str2 ) { for(; *str1 == *str2; ++str1, ++str2 ){ if( *str1 == '' ) return 0; } return ((*(unsigned char*)str1 < *(unsigned char*)str2)? -1 : +1); } /* Menu principal */ void menuPrincipal() { char opcao; do { do { system( "clear" ); printf( "Autenticacao de usuarios e senhas\n" ); printf( "1. Cadastrar usuario\n" ); printf( "2. Autenticar\n" ); printf( "3. Listar passwd.conf\n" ); printf( "5. Sair\n" ); printf( "> " ); fflush( stdin ); fflush( stdin ); scanf( "%c", &opcao ); getchar(); fflush( stdin ); if( opcao < '1' || opcao > '5' ) { printf( "Opcao invalida!" ); getchar(); } } while( opcao < '1' || opcao > '5' ); switch( opcao ) { case '1': cadastrar(); break; case '2': autenticar(); break; case '3': listar(); getchar(); break; case '5': break; } } while( opcao != '5' ); } /* autentica usuário e senha */ void autenticar() { char senhaTextoClaro[TAM_SENHA]; /* senha que será recolhida */ char senhaHash[TAM_MAX]; /* senha recuperada do arquivo passwd.conf */ char *senhaHashCalculada; /* hash calculado com a senha digitada */ char salt[TAM_SALT]; /* salt number */ int i, valor; char nome[TAM_MAX]; /* nome digitado */ char login[TAM_MAX]; /* login digitado */ bool status = false; /* guarda o retorno de vericaSeCadastrado, true significa que já existe */ colherDados( nome, login, senhaTextoClaro, não ); verificarSeCadastrado( login, senhaHash, &status ); if( status == true ) { getchar(); /* "pegar" o salt number do hash guardado em arquivo */ salt[0] = '$'; salt[1] = '1'; salt[2] = '$'; for( i=0; i<8; i++ ) { salt[i+3] = senhaHash[i+3]; salt[i+4] = ''; } /* calcula o hash com a senha digitada */ senhaHashCalculada = (char *) crypt(senhaTextoClaro, salt); valor = compara( senhaHash, senhaHashCalculada ); if( valor == 0 ) { printf( "Usuario cadastrado\n" ); getchar(); } else { printf( "Usuario ou senha incorretos\n%d\n", valor ); getchar(); } } else { printf( "\nUsuario não cadastrado!\n" ); getchar(); getchar(); } } /* Cadastra novos usuários */ void cadastrar() { char senhaTextoClaro[TAM_MAX]; /* senha que será recolhida */ char *senhaHash; /* hash da senha digitada */ char salt[TAM_SALT]; /* salt number */ char i; char nome[TAM_MAX]; char login[TAM_MAX]; char buffer[TAM_BUF]; /* Na hora de sortear os caracteres de salt number, apenas os caracteres * válidos serão usados */ char saltValidos[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuwxyz0123456789./"; char saltValidosTam = strlen(saltValidos); int spos; /* Colher os dados do novo usuário */ colherDados( nome, login, senhaTextoClaro, SIM ); /* Disparando uma semente de números randômicos */ srand(time(NULL)); /* Sorteando aleatoriamente caracteres do salt number */ salt[0] = '$'; salt[1] = '1'; /* indica que é o MD5 */ salt[2] = '$'; for (i = 0; i < 8; i++) { spos = random() % saltValidosTam; salt[i + 3] = saltValidos[spos]; salt[i + 4] = ''; /* fechando a string */ srand(random()); } getchar(); /* calcula o hash utilizando o MD5 */ senhaHash = (char *) crypt(senhaTextoClaro, salt); /* concatena as strings nome, login e hash no formato definido */ concatenar( buffer, nome, login, senhaHash ); /* guarda a senha no arquivo passwd.conf */ guardarSenha( buffer ); } /* Colhe os dados do novo usuário */ void colherDados( char *nome, char *login, char *senhaTextoClaro, int autenticacao ) { /* Colher dados */ if( autenticacao == SIM ) { printf( "Nome: " ); fflush( stdin ); scanf( "%s", nome ); } printf( "Usuario: " ); fflush( stdin ); scanf( "%s", login ); strcpy( senhaTextoClaro, getpass( "Senha: " ) ); } /* concatena as strings nome, login e hash no formato definido */ void concatenar( char *buffer, char *nome, char *login, char *senhaHash ) { strcpy( buffer, nome ); strcat( buffer, ":" ); strcat( buffer, login ); strcat( buffer, ":" ); strcat( buffer, senhaHash ); } /* armazena a string com o nome, login e senha no arquivo */ void guardarSenha( char *buffer ) { FILE *arq; /* tenta abrir o arquivo para guardar a string */ if( (arq = fopen( "passwd.conf", "a" )) == NULL ) { perror( "fopen" ); return; } else { fprintf( arq, "%s \n", buffer ); fclose( arq ); } } /* função que verifica se um usuario consta no arquivo passwd.conf */ void verificarSeCadastrado( char* loginDigitado, char* senhaHash, bool *status ) { /* declaração de variáveis */ FILE *arq; char buf[TAM_BUF]; char *nome, *login, *senha; /* verifica se houve sucesso na abertura do arquivo */ if( (arq = fopen( "passwd.conf", "r" )) == NULL ) { perror( "fopen" ); return; } else { /* extrai a primeira linha do arquivo */ fgets( buf, TAM_BUF, arq ); while(!feof(arq)) { /* extrai as substrings delimitadas por ":" */ nome = strtok( buf, ":" ); /* nome do usuário */ login = strtok( NULL, ":" ); /* login */ senha = strtok( NULL, ":" ); /* hash */ printf( "%s", senha ); /* verifica se achou o login do usuário */ if( strcmp(login, loginDigitado) == 0 ) { *status = true; strcpy( senhaHash, senha ); fclose(arq); return; } /* caso não tenha encontrado o usuário, extrai-se a próxima linha do arquivo */ fgets( buf, TAM_BUF, arq ); } fclose(arq); } } /* fim da função verificarSeCadastrado() */ /* função que verifica se um usuario consta no arquivo passwd.conf */ void listar() { /* declaração de variáveis */ FILE *arq; char buf[TAM_BUF]; /* verifica se houve sucesso na abertura do arquivo */ if( (arq = fopen( "passwd.conf", "r" )) == NULL ) { perror( "fopen" ); return; } else { /* extrai a primeira linha do arquivo */ fgets( buf, TAM_BUF, arq ); while(!feof(arq)) { printf( "%s", buf ); /* caso não tenha encontrado o usuário, extrai-se a próxima linha do arquivo */ fgets( buf, TAM_BUF, arq ); } fclose(arq); } } /* fim da função verificarSeCadastrado() */
  3. Blitzen

    Solução de Warning

    Obrigado pela ajuda, reescrevi os trechos assim: ipc = (struct ip *)(pacote + sizeof( struct ether_header )); payload = (char *)(pacote + sizeof( struct ether_header ) + ipc->ip_len); Fácil quando se sabe! ;) vlw []'s
  4. kd a dúvida em C? Não vai dizer que você quer SÓ o programa.
  5. Blitzen

    Chamar método

    Tem alguns erros, mas tente resolver esses dois que vou te passar e veja se consegue resolver os demais: 1) Quando você declara um vetor, int v[3] por exemplo, as posições de seu vetor são v[0], v[1], e v[2]. Vamos supor que sejam 3 pares os dados inseridos em seu problema. Dê uma olhada nos seus laços for, eles começam com 1 e vão até 3 ( for( i=1; i<=n; i++) ), agora vejamos quais posições do vetor ele vai acessar: v[1], v[2] e v[3]!, Opa, v[3] não existe! As posições, como já lhe falei, são v[0], v[1] e v[2]. Faça assim com o laço for( i=0; i<n; i++ ) { comandos; } 2) Na função RR você cria um vetor aux[MAX] e não inicializa suas posições, depois o passa como parâmetro para a função calcula_soma() que tenta acessar todas as posições, mas ao fazer isso a função vai pegar lixo que está na memória e o resultado disso é imprevisível. Ah, nessas funções também tem o problema do for que te mostrei no item 1. Melhora o código e depois posta aih pra ver como ficou. []'s
  6. Estou estudando captura de pacotes com a Libpcap. Baixei um manual na página oficial da biblioteca www.tcpdump.org e quando tento compilar o programa-exemplo aparecem dois warnings: paulo@paulo-desktop$ gcc -o pcap_lookupdev pcap_lookupdev.c -lpcap -Wall pcap_lookupdev.c: In function ‘my_callback’: pcap_lookupdev.c:40: warning: assignment from incompatible pointer type pcap_lookupdev.c:62: warning: assignment discards qualifiers from pointer target type esses são os trechos que estão com problema: void my_callback( u_char *useless, const struct pcap_pkthdr* pkthdr, const u_char *pacote ) { static int count = 0; count++; printf( "\n" ); struct ether_header *eptr; struct ip *ipc; char *payload; (...) ipc = pacote + sizeof( struct ether_header ); /* linha 40 */ (...) payload = pacote + sizeof( struct ether_header ) + ipc->ip_len; /* linha 62 */ } Omiti as linhas intermediárias. Obrigado
  7. Quero passar uma matriz bidimensional e uma unidimensional para funções via ponteiro, porém não sei como faço para acessar os campos das matrizes nas funções. Abaixo os códigos: ESTRUTURA typedef char string[25]; typedef struct Musica{ string Nome; string Cantor; string Grupo; string Estilo; int Duracao; }T_Musica, T_Lista[LIMITE_LISTA]; typedef struct Nome_Listas{ string nome_lista; int indice; } T_Nome_Listas; T_Lista ConjuntoListas[LIMITE_CONJUNTO_LISTAS]; T_Nome_Listas Nome_Listas[LIMITE_CONJUNTO_LISTAS]; T_Nome_Listas *P_Nome_Listas; FUNÇÃO int getlist( T_Nome_Listas *P_Nome_Listas ) { int indice=0; while( (indice < COL) && *(P_Nome_Listas+indice)->indice != -1) [u]<= NESTA LINHA dá ERRO "invalid type argument of unary *"[/u] indice++; /* chegou ao final da lista e não encontrou espaço livre */ if(indice == COL) indice = -1; return( indice ); }
  8. Blitzen

    Programa com ponteiros

    Veja só, no protótipo da função menu6, você passa dois ponteiros de inteiros como parâmetros. Já na main, você não passa nada como parâmetro para a mesma função, e no cabeçalho da função menu6 o parâmetro é um char. Os tipos devem ser iguais senão não compila.
  9. Blitzen

    Programa com ponteiros

    Bem, o enunciado do problema pede que o vetor seja uma variável local (declarada dentro da função main) e não global. Além disso, tem que haver passagem de parâmetro por referência para as funções. Se é um trabalho da facul, melhor corrigir esses problemas primeiro.
  10. Blitzen

    calcular peso ideal

    para strings utilize o gets() ao invés do scanf(), assim printf("Digite o nome: "); gets(nome); :)
  11. Blitzen

    DESAFIO DE NOVATO

    Só uma coisa: SEMI-perímetro é o perímetro dividido por 2 e não por 3. Esta é a fórmula de Hierão: p = (a+b+c)/2 = semi-perímetro S = raiz quadrada [p * (p - a) * (p - b ) * (p - c)] Beleza?
  12. Estude também recursividade, a segunda parte da comparação dentro do return é uma função recursiva.
  13. ops, obrigado pelo toque. É que tinha um monte de linha de comentários (que só eu entendo) e eu as tirei para postar e acidentalmente exclui a linha que chamava a função tela. Entretanto, um amigo me mostrou que, além de erro de sintaxe na função tela() havia também erro de looping infinito na função procura() :P. CORRETO: void tela( struct valor *dados ) { printf("n: "); scanf("%f", &((*dados).n)); printf("A: "); scanf("%f", &((*dados).A)); printf("precisao: "); scanf("%f", &((*dados).precisao)); return; } RESOLVIDO. Obrigado.
  14. Olá, Sou aluno de SI e estou com um problema para resolver uma passagem por referência. Esse código compila sem nenhum problema, mas na execução não passa da função tela(), ele trava depois de pegar os valores. Alguém saberia me dizer por quê? -------------- /* Programa: raiz.c * Descrição: Este programa calcula a raiz n-ésima de x através do método * de Newton-Raphson. */ #include <stdio.h> #include <math.h> typedef struct valor { float n; float A; float precisao; } valor; typedef enum { false, true } boolean; void tela( struct valor *dados ) { printf("n: "); scanf("%f", &(*dados).n); printf("A: "); scanf("%f", &(*dados).A); printf("precisao: "); scanf("%f", &(*dados).precisao); return; } float procura( struct valor *dados ) { float fx, x0; boolean achei; achei = false; x0 = (*dados).A - 1; (*dados).precisao = 1 / pow(10, (*dados).precisao); fx = pow( x0, (*dados).n ) - (*dados).A; fx < 0 ? fx *= -1 : fx; if( fx < (*dados).precisao ) return fx; else while( !achei ) { x0 = x0 - ( pow(x0, (*dados).n) / pow((*dados).n * x0, (*dados).n - 1) ); fx = pow( x0, (*dados).n ) - (*dados).A; fx < 0 ? fx *= -1 : fx; if( fx < (*dados).precisao ) achei = true; } return fx; } int main() { struct valor dados; tela( &dados ); printf("raiz: %f", procura( &dados )); return 0; } -------------- Obrigado.
×
×
  • Criar Novo...