AJBM Posted December 16, 2012 Report Share Posted December 16, 2012 Boas! Eu queria converter esta string "12/11/1993" para inteiro. Eu fiz isto mas nem sempre funciona unsigned short int converterData(short num, char string[], char car) { unsigned i = 0; char contem[10]; while (i < 10) { if (string[i] != car) { contem[i] = string[i]; }else{ contem[i]=' '; } i++; } return (atoi(&contem[num])); } printf("Dia %hu",converterData(0,"12/11/1993",'/')); printf("Mes %hu",converterData(2,"12/11/1993",'/')); printf("Ano %hu",converterData(6,"12/11/1993",'/')); Link to comment Share on other sites More sharing options...
pmg Posted December 16, 2012 Report Share Posted December 16, 2012 Precisas de espaco para o terminador de strings! E, claro, meter la o terminador valido. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 16, 2012 Report Share Posted December 16, 2012 (edited) como queres formatar/codificar um valor de uma data num único valor numérico ? existe soluções, mas não dá para perceber como tu queres ... ps : estive a ver melhor o teu código, vê o seguinte que deverá ser mais fácil de perceber: typedef enum { DIA, MES, ANO } CompData; unsigned short converterData(CompData componente, char string[], char car) { char * format = "%d-%d-%d"; // nota que coloquei o caracter '-' de propósito int dia, mes, ano; format[2] = format[5] = car; // alterar o caracter separador sscanf(string, format, &dia, &mes, &ano); // ler a informação da string switch (componente) // retornar o componente pedido { case DIA : return dia; case MES : return mes; case ANO : return ano; } } int main() { printf("Dia %hu",converterData(DIA,"12/11/1993",'/')); printf("Mes %hu",converterData(MES,"12/11/1993",'/')); printf("Ano %hu",converterData(ANO,"12/11/1993",'/')); return 0; } Edited December 16, 2012 by pmg erro off-by-one IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
AJBM Posted December 16, 2012 Author Report Share Posted December 16, 2012 A ideia era depois guardar o 12 no dia 11 no mês 1993 no ano, Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 16, 2012 Report Share Posted December 16, 2012 A ideia era depois guardar o 12 no dia 11 no mês 1993 no ano, isso não ens absolutamente nada haver com o código apresentado ... sprintf(string_data, "%d/%d/%d", dia, mes, ano); IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
AJBM Posted December 16, 2012 Author Report Share Posted December 16, 2012 Eu acho que já percebi mais ao menos o que fizeste. O fomat é o formato da string que eu vou passar é por isso que tu fazes isto format[2] = format[5] = car; a função sscanf(string de onde serão lidos os dados,formato da string, variáveis... ) Não percebi muito vem foi o format ser um apontador, um apontador normalmente não aponta para um endereço de memoria, por exemplo isto sei que é possível, e percebo char * fomart=&car. podes explicar me mais em concreto o format? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 16, 2012 Report Share Posted December 16, 2012 foi um mau exemplo, mas por uma razão que desconheces. um apontador aponta sempre para uma posição de memória, o problema é que muitas vezes essa memória não se encontra acessível, como no caso do valor NULL. ao escreveres a string "XPTO" no código, estás a dizer ao compilador para gaurdar essa string numa zona da aplicação, e ao ser atribuido a um ponteiro, estas a dizer que estas a apontar para essa região de memória. o problema de ser um mau exemplo é que não podes alterar essa memória. se executares o código, terás um segmentation fault. mas se testares o seguinte, já estará correcto: #include <stdio.h> #include <string.h> typedef enum { DIA, MES, ANO } CompData; unsigned short converterData(CompData componente, char string[], char car) { char format[9]; int dia, mes, ano; strcpy(format, "%d-%d-%d"); format[2] = format[5] = car; sscanf(string, format, &dia, &mes, &ano); switch (componente) { case DIA : return dia; case MES : return mes; case ANO : return ano; } } int main() { printf("Dia %hu",converterData(DIA,"12/11/1993",'/')); printf("Mes %hu",converterData(MES,"12/11/1993",'/')); printf("Ano %hu",converterData(ANO,"12/11/1993",'/')); return 0; } para entenderes a função sscanf, podes sempre ver na documentação. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
AJBM Posted December 16, 2012 Author Report Share Posted December 16, 2012 ok obrigado, eu também tive a ver umas coisas, e fiz umas alterações ao código que disponibilizas te, retirei o apontador já não passo a variável car. Não sei se assim esta na forma mais correcta mas funciona. Obrigado outra vez pela tua ajuda 👍 unsigned short int converterData(unsigned op, char string[]) { char format[] = "%d/%d/%d"; //ja coloquei o carácter '/' unsigned short int dia, mes, ano;//alterei os formatos das variáveis sscanf(string, format, &dia, &mes, &ano); switch (op) // retornar data pedida { case 0: return dia; case 1: return mes; case 2: return ano; } } Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 16, 2012 Report Share Posted December 16, 2012 se não passar o caracter separador, o mais simples é : unsigned short int converterData(unsigned op, char string[]) { unsigned short dia, mes, ano; sscanf(string, "%d/%d/%d", &dia, &mes, &ano); switch (op) { case 0: return dia; case 1: return mes; case 2: return ano; } } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
AJBM Posted December 16, 2012 Author Report Share Posted December 16, 2012 Eu quando testo este codigo no main funciona, quando junto com o que eu tenho feito não funciona. unsigned int converterData(unsigned op, char string[]) { // nota que coloquei o caracter '-' de propósito unsigned int dia, mes,ano; sscanf(string,"%u/%u/%u",&dia,&mes,&ano); // ler a informação da string switch (op) // retornar data pedida { case 0: return dia; case 1: return mes; case 2: return ano; } } Data addDataNascimento(Data data) { char dataNas[TAMANHO_DATA_NASCIMENTO_CODIGO_POSTAL]; pedirDataNascimento(dataNas, TAMANHO_DATA_NASCIMENTO_CODIGO_POSTAL); data.dia = converterData(0,dataNas); data.mes = converterData(1,dataNas); data.ano = converterData(2,dataNas); return data; unsigned char pedirDataNascimento(char* dataNas, int data_size) { unsigned int stringSize; printf("Introduza a sua data nascimento(DD/MM/AAAA):"); if (fgets(dataNas, data_size, stdin) != NULL) { stringSize = strlen(dataNas) - 1; if (dataNas[stringSize] == '\n') { dataNas[stringSize] = '\0'; return 1; } } else return 0; } Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 17, 2012 Report Share Posted December 17, 2012 como as pessoas gostam de complicar ... se queres então complicar que compliques o menor do necessário : #include <stdio.h> #include <stdlib.h> typedef struct Date { unsigned int day; unsigned int month; int year; } Date; /** * Função de leitura de uma data inserida pelo teclado * * @param message Mensagem a ser apresentada * @param date Ponteiro para a estrutura Date que guardará a data inserida * @return 0 em caso de sucesso ou um valor diferente de zero em caso de erro */ int inputDate(const char * message, Date * date) { char buffer[256]; int month_days = 0; /* apresentar a mensagem de pedido de informação de data */ printf("%s (DD/MM/AAAA):", message); if (fgets(buffer, 256, stdin) == NULL) return -1; /* interpretar a data do buffer de leitura e guardar os dados directamente * na estrutura de data passada como argumento */ if (sscanf(buffer, "%u/%u/%d", &date->day, &date->month, &date->year) != 3) return -2; /* validar o valor de mes inserido */ if (date->month < 1 || date->month > 12) return -3; /* determinar quantos dias tem o mes inserido */ switch (date->month) { case 2: month_days = 28; if (date->year % 400 == 0 && date->year % 100 != 0 && date->year % 4 == 0) month_days++; break; case 4: case 6: case 9: case 11: month_days = 30; break; default: month_days = 31; break; } /* calidar o valor de dia inserido */ if (date->day < 1 || date->day > month_days) return -4; return 0; } int main() { Date date; switch (inputDate("Insira a data de nascimento", &date)) { case -1: printf("Erro ao ler do teclado\n"); break; case -2: printf("Erro ao ler a data do teclado\n"); break; case -3: printf("Mes inválido\n"); break; case -4: printf("Dia inválido\n"); break; } return 0; } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
AJBM Posted December 17, 2012 Author Report Share Posted December 17, 2012 como as pessoas gostam de complicar ... se queres então complicar que compliques o menor do necessário : #include <stdio.h> #include <stdlib.h> typedef struct Date { unsigned int day; unsigned int month; int year; } Date; /** * Função de leitura de uma data inserida pelo teclado * * @param message Mensagem a ser apresentada * @param date Ponteiro para a estrutura Date que guardará a data inserida * @return 0 em caso de sucesso ou um valor diferente de zero em caso de erro */ int inputDate(const char * message, Date * date) { char buffer[256]; int month_days = 0; /* apresentar a mensagem de pedido de informação de data */ printf("%s (DD/MM/AAAA):", message); if (fgets(buffer, 256, stdin) == NULL) return -1; /* interpretar a data do buffer de leitura e guardar os dados directamente * na estrutura de data passada como argumento */ if (sscanf(buffer, "%u/%u/%d", &date->day, &date->month, &date->year) != 3) return -2; /* validar o valor de mes inserido */ if (date->month < 1 || date->month > 12) return -3; /* determinar quantos dias tem o mes inserido */ switch (date->month) { case 2: month_days = 28; if (date->year % 400 == 0 && date->year % 100 != 0 && date->year % 4 == 0) month_days++; break; case 4: case 6: case 9: case 11: month_days = 30; break; default: month_days = 31; break; } /* calidar o valor de dia inserido */ if (date->day < 1 || date->day > month_days) return -4; return 0; } int main() { Date date; switch (inputDate("Insira a data de nascimento", &date)) { case -1: printf("Erro ao ler do teclado\n"); break; case -2: printf("Erro ao ler a data do teclado\n"); break; case -3: printf("Mes inválido\n"); break; case -4: printf("Dia inválido\n"); break; } return 0; } Eu usei o isto, mas também não deu. por exemplo 12/12/1993, quando vou a listar o ano só aparece 199 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 17, 2012 Report Share Posted December 17, 2012 Eu usei o isto, mas também não deu. por exemplo 12/12/1993, quando vou a listar o ano só aparece 199 não sei o que andas a fazer, mas o código que apresentei está correcto IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Rui Carlos Posted December 18, 2012 Report Share Posted December 18, 2012 Eu usei o isto, mas também não deu. por exemplo 12/12/1993, quando vou a listar o ano só aparece 199 Certifica-te que não tens erros no teu código. O código do HappyHippyHippo parece estar correcto, e não tive problemas com o valor 12/12/1993. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
AJBM Posted December 18, 2012 Author Report Share Posted December 18, 2012 Ja funciona, o tamanho da data estava errado, obrigado pela ajuda Link to comment Share on other sites More sharing options...
Lobits Posted January 5, 2013 Report Share Posted January 5, 2013 desculpem eu estou a fazer um programa de codificação e descodificação de moorse pa escola, mas uma das alineas é enviar sinal horario e de data, ou seja tenho de pedir ao pc a data, pois nao pode ser o utilizador a pedir, a parte da encriptação tenho feito queria era saber como chamar a data do systema ou da bios e transformar numa ma string. penso que com um getche isto da mas como não sei como chamar a data do systema não consigo confirmar. alguem me pode ajudar? comprimentos 🙂 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 5, 2013 Report Share Posted January 5, 2013 http://www.cplusplus.com/reference/ctime/ctime/ 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
pmg Posted January 5, 2013 Report Share Posted January 5, 2013 Alem do ctime() sugerido pelo Hippo, podes usar o strftime(). Com a funcao strftime() podes formatar o resultado como pretenderes. 1 Report What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now