Ir para o conteúdo
AJBM

[Resolvido] Converter String

Mensagens Recomendadas

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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;
}

Editado por pmg
erro off-by-one

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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;
}
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

:)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

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

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

  • Voto 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.