Jump to content
Xyde

Verificar data introduzida (dd/mm/aaaa) numa string

Recommended Posts

Xyde

Queria saber como verificar uma data introduzida numa string no formato: dd/mm/aaaa

Sei que existem umas funções da libraria string.h que permitem operações nas strings. uma delas dá para determinar se existe um determinado caractere numa string, retornando o numero de vezes que encontrou esse caracter na string.

Partindo daí, já consigo saber se o utilizador introduziu as 3 barras (/ / /) que constituem a data

Agora o meu problema é separar os três campos que constituem a data e verificá-los individualmente.

Alguém tem ideia de como posso fazer isso? Se fosse possível dar um código de exemplo agradecia.

Obrigado desde já!  ;)

Share this post


Link to post
Share on other sites
yyajsayy

Então, sabes que o formato da data é dd/mm/yy

Há partida sabes que:

  • o primeiro d pode ter valores de 0,1,2 e 3
  • o segundo pode tomar valores de 0 - 9

Pronto, então, soluções para a implementação:

- Pedes a data ao utilizador.

- Armazenas a data em um tipo de dados String, (um vector claro)

- Em seguida aplicas-lhe o algoritmo que vais contruir.

Algoritmo:

[*]Utilizas a função strtok(); e defines o parametro de busca neste caso / , e ela irá-te retornar a string até ao /, aí vais ter os dois dd para analisar, se cumprirem as exigências que vimos em cima então avanças e fazes exactamente o mesmo para os outros 2 pedaços

[*]Voltas a aplicar a função strtok(); até / e fazes esse procedimento

[*]Depois à partida sabes que vais ter mais 2 digitos (yy), não aplicas a função strtok mas avancas na string 2 casas, e verificas uma a uma ..

Não sei se fui muito claro, atenção que para comparares elemento a elemento da string tens de o fazer iterativamente do genero vector==0 || vector==1 ... não poderás usar a função strcpm() ..

Há, e assim que o utilizador insere a data, verifica se ela possui o tamanho que deve ter, neste caso 9 com a função strlen();

Deixo links:

http://www.cplusplus.com/reference/clibrary/cstring/strtok/

http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

http://pt.wikibooks.org/wiki/Programar_em_C/Vetores

E antes de postares um tópico, tenta procurar aqui no fórum ;)

http://www.portugal-a-programar.pt/index.php?showtopic=34319


"If it don't work the first time, rename it to version 1.0."

http://seguranca-informatica.pt

Share this post


Link to post
Share on other sites
PJM

Podes também usar o sscanf e guardar os valores directamente num array de inteiros, por exemplo:

#include <stdio.h>
#include <string.h>

int main()
{
char *dateSTR = "24/12/2010";
int dateINT[3], i;

if ( sscanf(dateSTR, "%d/%d/%d", &dateINT[0], &dateINT[1], &dateINT[2]) == 3)
{
	printf("Data correcta");
} else {
	printf("Errado");
}

return 0;
}

Basicamente o sscanf funciona da seguinte forma: sscanf( 1, 2, 3...N)

1 = Corresponde ao nome da variável onde a string esta guardada

2 = Vais meter o que é que queres ler da string, se um inteiro (%d), um char(%c), etc...

3..N = vais meter as variáveis por ordem onde queres gravar os valores que meteste no formato (passo 2)

Cumprimentos ;)

Edit: já me esquecia, a função devolve o número de elementos que conseguiu ler segundo esse formato

Share this post


Link to post
Share on other sites
PJM

Não está Tharis, mas eu pensei que a string já estava posta no formato correcto, porém isso é fácil de resolver:

if ( sscanf(dateSTR, "%d/%d/%d", &dateINT[0], &dateINT[1], &dateINT[2]) == 3 ) //Pelo menos esta correcto o facto de serem 3 numeros separados por /
{
     if ( (dateINT[0] > 0 && dateINT[0] < 32) && (dateINT[1] > 0 && dateINT[1] < 13) && (dateINT[2] > 1900 && dateINT[2] < 2100 ) )
    {
        printf("Data correcta");
     } else {
        printf("Incorrecta");
    }
} else {
    printf("Formato inválido");
}

Eu só estava a tentar ajudar, e pensei que ao ler a string a data já estava inserida de forma correcta, peço desculpa pelo lapso.

Cumprimentos ;)

Share this post


Link to post
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.