Invalid Digit [RESOLVIDO]

1. Invalid Digit [RESOLVIDO]

Lucas
~lujjc4

(usa Ubuntu)

Enviado em 13/12/2011 - 13:40h

Eaw forumeiros :]
então.. nessa parte do code a ideia é pega o numero do mês que foi informado "01 == janeiro" etc.. o problema é que quando eu coloco 08 e 09 no case para agosto e setembro respectivamente.. na compilação não é aceito usar 08 e 09 com a seguinte menssagem "Invalid Digit "8" in octal constant" alguem poderia me explicar detalhadamente o que seria octal constant? e se o usuario informar o mes como 08 referente a agosto como eu irei identificar?


aqui segue um exemplo :


REFAZ: printf ("\nData de hoje: ");
scanf ("%02d/%02d/%02d", &dia,&mes,&ano);
switch (mes)
case 01,03,05,07,08,10,12: if (dia<=0) || (dia>=32) printf ("\nData informada invalida.\n") goto REFAZ;





  


2. Re: Invalid Digit [RESOLVIDO]

Luís Fernando C. Cavalheiro
lcavalheiro

(usa Slackware)

Enviado em 13/12/2011 - 13:51h

Meu caro, eu não entendo de programação, portanto eu só vou identificar o problema e explicá-lo. O problema é que em C geralmente um número iniciado com 0 é entendido como sendo um octal, isto é, um número em base 8. Sendo assim, ele só reconhece os dígito 0, 1, 2, 3, 4, 5, 6 e 7. O número 8 em octal se escreve 010, o número 9 se escreve 011, e assim vai. Tenta substituir os números por seus equivalentes octais e veja o que dá.
Outra opção é escrever os números como 1, 2, 3... (sem o 0 na frente), que aí ele entende que se trata de valores decimais.


3. Re: Invalid Digit [RESOLVIDO]

Levi Gomes
levi linux

(usa Arch Linux)

Enviado em 13/12/2011 - 14:37h

lcavalheiro escreveu:

Meu caro, eu não entendo de programação, portanto eu só vou identificar o problema e explicá-lo. O problema é que em C geralmente um número iniciado com 0 é entendido como sendo um octal, isto é, um número em base 8. Sendo assim, ele só reconhece os dígito 0, 1, 2, 3, 4, 5, 6 e 7. O número 8 em octal se escreve 010, o número 9 se escreve 011, e assim vai. Tenta substituir os números por seus equivalentes octais e veja o que dá.
Outra opção é escrever os números como 1, 2, 3... (sem o 0 na frente), que aí ele entende que se trata de valores decimais.


De fato é o que o colega disse acima.
Mas recomendo que leia o seguinte artigo.

http://www.vivaolinux.com.br/artigo/Parametros-interessantes-do-scanf-e-do-printf-em-C?pagina=2

Aqui tem explicações interessantes sobre o scanf.

Boa sorte!




4. Re: Invalid Digit [RESOLVIDO]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 14/12/2011 - 10:33h

Olá!

O scanf() irá ler sua data com os zeros e as barras, mas irá armazená-lo sem isso.

E no switch(), você está colocando os números em base octal, 01, 02, ... etc. Como já foi dito, o 8 não faz parte da base octal.

Portanto, faça um swith(){ 1: 2: 3:... etc..}


Tenta ai, provavelmente funcionará.

Espero ter ajudado,
Enzo Ferber
[]'s


EDIT: scanf("%02d", &dia); // digitar: 01 -> dia = 1


5. Re: Invalid Digit [RESOLVIDO]

Lucas
~lujjc4

(usa Ubuntu)

Enviado em 14/12/2011 - 13:06h

Valeu pelas postagens pessoal (;


Levi valeu pelo link muito bom mesmo agente saber aproveitar o maximo de uma função principalmente como o printf e scanf que pareçem ser tão simples mas implementadas com algumas outras podem fazer magica (;


Enzo, vê só no caso da data.. o usuário vai me informar ela no seguinte formato:

por exemplo 15 de abril de 2012: 15/04/2012
ai em seguinta o switch vai selecionar o mês para ver se o dia realmente é valido exemplo:

switch (mes)
{
case 04: if (dia >=32) II (dia <=0) printf ("Data invalida);
break;
}

já no caso do mês de agosto o usuario informaria 15/08/2012
como o "case" iria reconheçer 08 que vai ficar armazenado na variável "mes" ?
a ideia da data é ser informada no seguinte formato XX/XX/XXXX

Valew aew :]


6. Re: Invalid Digit [RESOLVIDO]

Luís Fernando C. Cavalheiro
lcavalheiro

(usa Slackware)

Enviado em 14/12/2011 - 13:50h

Até onde eu saiba, você só vai conseguir armazenar a data no formato dd/mm/aaaa se usar uma máscara de campo na base de dados onde a data será salva OU armazenar como texto (o que dificulta as operações com data).


7. Re: Invalid Digit [RESOLVIDO]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 15/12/2011 - 09:11h


// date.c
// Enzo Ferber - dez 2011

#include <stdio.h>
#include <stdlib.h>

// array com nomes
char *meses[12] = { "Janeiro", "Fevereiro", "Marco", "Abril", "Maio", "Junho",
"Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro" };

int main ( void )
{
int dia, mes, ano;

REFAZ:
printf ( "Data(dd/mm/aa): "); __fpurge(stdin); scanf("%02d/%02d/%02d", &dia, &mes, &ano );

switch ( mes ) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
// meses com 31 dias
// Jan, Mar, Mai, Jul, Ago, Out, Dez
if ( (dia < 1) || (dia > 31) ){
printf ( "%s nao possui %d dias.\n", meses[ mes - 1 ], dia );
goto REFAZ;
}
break;
case 2:
// fevereiro - nao tem calculos baseados nos anos,
// assumo que todo fevereiro possa ter 29 dias ;)
if ( (dia < 1 ) || (dia > 29) ){
printf ( "%s nao possui %d dias.\n", meses[ mes - 1 ], dia );
goto REFAZ;
}
break;
default:
// todos os outros meses
// Abr, Jun, Set, Nov
if ( (dia < 1) || (dia > 30) ) {
printf ( "%s nao possui %d dias.\n", meses[ mes - 1 ], dia );
goto REFAZ;
}
break;
}
printf ( "%d de %s de %d\n", dia, meses[ mes - 1], ano );

return 0;
}
// EoF




8. Re: Invalid Digit [RESOLVIDO]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 15/12/2011 - 09:13h

Como eu disse, quando você lê um número inteiro com essa máscara, ele armazena o número sem o ZERO.


Ou seja, se você digitar: 01, ele vai armazenar 1 na variável.

;)

No switch(), você coloca apenas o número 1:


Faz um teste ai:


$ ./date
Data(dd/mm/aa): 01/02/03
Dia: 1
Mes: 2
Ano: 3
$


Entendeu?


Enzo Ferber
[]'s


9. Re: Invalid Digit [RESOLVIDO]

Lucas
~lujjc4

(usa Ubuntu)

Enviado em 15/12/2011 - 12:49h

Valeuu Enzao :D vou da uma testada mais só depois que agora tou no trampo :]

vou marcar logo como resolvido !!

valew


10. Re: Invalid Digit [RESOLVIDO]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 16/12/2011 - 22:41h

~lujjc4 escreveu:

Valeuu Enzao :D vou da uma testada mais só depois que agora tou no trampo :]

vou marcar logo como resolvido !!

valew


E ai parceiro, resolvido mesmo?
Ou não deu certo?

Posta o feedback aí, pô!

Enzo Ferber
[]'s


11. Re: Invalid Digit [RESOLVIDO]

Lucas
~lujjc4

(usa Ubuntu)

Enviado em 20/12/2011 - 22:17h

EnzoFerber escreveu:

~lujjc4 escreveu:

Valeuu Enzao :D vou da uma testada mais só depois que agora tou no trampo :]

vou marcar logo como resolvido !!

valew


E ai parceiro, resolvido mesmo?
Ou não deu certo?

Posta o feedback aí, pô!

Enzo Ferber
[]'s



eae Enzão, caraca sabe o que tava me dando a mor dor de cabeça aqui?
o uso do scanf com %02d/%02d/%02d
eu informava a data : 15/04/1993 ai coloquei um printf para ver como tava ficando ele me retornava
Dia: 134514281
Mes: -1074838360
Ano: 134520820

ai eu deichei apenas
scanf ("%d/%d/%d", dia,mes,ano);
ai me retornou
Dia: 15
Mes: 4
Ano: 1993

funcionou perfeitamente :]
valeu !! até a proxima!!







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts