Jump to content

[Resolvido] Converter String


AJBM

Recommended Posts

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

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
Link to comment
Share on other sites

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

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
Link to comment
Share on other sites

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

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
Link to comment
Share on other sites

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

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
Link to comment
Share on other sites

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

  • 3 weeks later...

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

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!

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.