AJBM Posted December 16, 2012 at 06:27 PM Report Share #487391 Posted December 16, 2012 at 06:27 PM 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 at 06:41 PM Report Share #487392 Posted December 16, 2012 at 06:41 PM 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 at 06:41 PM Report Share #487393 Posted December 16, 2012 at 06:41 PM (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 at 07:02 PM 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 at 06:52 PM Author Report Share #487397 Posted December 16, 2012 at 06:52 PM 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 at 07:08 PM Report Share #487402 Posted December 16, 2012 at 07:08 PM 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 at 10:24 PM Author Report Share #487432 Posted December 16, 2012 at 10:24 PM 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 at 10:40 PM Report Share #487435 Posted December 16, 2012 at 10:40 PM 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 at 10:53 PM Author Report Share #487438 Posted December 16, 2012 at 10:53 PM 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 at 10:59 PM Report Share #487440 Posted December 16, 2012 at 10:59 PM 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 at 11:19 PM Author Report Share #487446 Posted December 16, 2012 at 11:19 PM 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 at 09:17 AM Report Share #487458 Posted December 17, 2012 at 09:17 AM 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 at 05:25 PM Author Report Share #487520 Posted December 17, 2012 at 05:25 PM 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 at 05:32 PM Report Share #487523 Posted December 17, 2012 at 05:32 PM 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 at 12:12 AM Report Share #487630 Posted December 18, 2012 at 12:12 AM 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 at 04:57 PM Author Report Share #487713 Posted December 18, 2012 at 04:57 PM 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 at 02:54 PM Report Share #489737 Posted January 5, 2013 at 02:54 PM 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 at 04:16 PM Report Share #489752 Posted January 5, 2013 at 04:16 PM 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 at 08:15 PM Report Share #489799 Posted January 5, 2013 at 08:15 PM 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