Jump to content
AJBM

[Resolvido] Converter String

Recommended Posts

AJBM

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",'/'));

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
HappyHippyHippo

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 by pmg
erro off-by-one

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
AJBM

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?

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
AJBM

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 :thumbsup:

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;
}
}

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
AJBM

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;
}

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
AJBM

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

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
Rui Carlos

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.

Share this post


Link to post
Share on other sites
Lobits

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

:)

Share this post


Link to post
Share on other sites
pmg

Alem do ctime() sugerido pelo Hippo, podes usar o strftime().

Com a funcao strftime() podes formatar o resultado como pretenderes.

  • Vote 1

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!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.