Inacabado Posted February 5, 2016 at 11:40 AM Report Share #593196 Posted February 5, 2016 at 11:40 AM (edited) Muito bom dia a toda a comunidade, e um muito bom dia ao meu amigo HappyHippo em especial; Tenho um problema no seguinte código: #include <stdio.h> void dobro(int *a); int main() { int n=0; printf("introduza numero:\n"); while (scanf("%d",&n)==0) fflush(stdin); dobro(&n); printf("Dobro: %d\n",n); return 0; } void dobro(int *a) { *a*=2; } ~ O problema é o seguinte: quero condicionar a entrada de dados a só aceitar dígitos. Ora eu costumo fazer de outra maneira do {...}(while n > '9' && n< '0') , mas encontrei esta "solução" que achei elegante no livro do Luís Damas que costumo estudar/consultar e quis aplicar. O problema é que quando insiro um numero a seguir a ter inserido uma letra ele não me dá o dobro. Parece que não salta o ciclo while!!! Agradecia imenso uma indicação que me leve á resolução deste problema. Muito obrigado a todos um abraço a todos e um especial para o HappyHippo. Edited February 5, 2016 at 12:06 PM by Inacabado Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted February 6, 2016 at 10:43 AM Report Share #593217 Posted February 6, 2016 at 10:43 AM o código apresentado não tem problema nenhum, o que necessitas é perceber o que está a acontecer com a instrução fflush(stdin) while (scanf("%d", &n) == 0) // enquanto não for possível ler um valor numérico do buffer de leitura fflush(stdin); // limpar o buffer de leitura agora imagina que inseres a string "n23", o scanf irá falhar por causa do caracter 'n'. devido a isso, a instrução fflush será chamada que irá limpar tudo o que se encontra no buffer de entrada. isto é, o buffer fica sem nada o que irá fazer com que a chamada do scanf do ciclo fique à espera que voltes a inserir novos dados. para ver se percebes melhor o que acontece, altera o código para algo mais user-friendly: do { printf("valor ? : "); fflush(stdout); fflush(stdin); } while (!scanf("%d", &n)); IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Inacabado Posted February 7, 2016 at 03:30 PM Author Report Share #593244 Posted February 7, 2016 at 03:30 PM (edited) agora imagina que inseres a string "n23", o scanf irá falhar por causa do caracter 'n'. devido a isso, a instrução fflush será chamada que irá limpar tudo o que se encontra no buffer de entrada. isto é, o buffer fica sem nada o que irá fazer com que a chamada do scanf do ciclo fique à espera que voltes a inserir novos dados. Sim mas se inserir somente "n" e carregar "enter", ele limpa o buffer e aguarda a entrada de outro valor. A seguir ao "n" eu insiro o "23" e carrego "enter" e não me dá o dobro!!! Continua a receber valores... Isso é que eu não entendo; pois o segundo valor era um inteiro, por isso deveria saltar o ciclo while, pois a condição já não se verificava! Edited February 7, 2016 at 03:33 PM by Inacabado Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted February 8, 2016 at 01:17 AM Report Share #593259 Posted February 8, 2016 at 01:17 AM Sim mas se inserir somente "n" e carregar "enter", ele limpa o buffer e aguarda a entrada de outro valor. não, ele nem grava valor nenhum A seguir ao "n" eu insiro o "23" e carrego "enter" e não me dá o dobro!!! Continua a receber valores... mas isso eu já expliquei ... ao ler o 'n' falha e o buffer de leitura é limpo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Inacabado Posted February 8, 2016 at 06:08 PM Author Report Share #593275 Posted February 8, 2016 at 06:08 PM (edited) Ok Acho que não estou a perceber bem o que é que a função fflush(stdin) && fflush(stdout) fazem... Vou-me documentar melhor a respeito. Já agora gostava de perguntar se mantendo o mesmo código: while (scanf("%d",&n)==0) fflush(stdin); ... e utilizando este desenho com as alterações ainda necessárias a fazer consigo limitar a entrada do scanf apenas a aceitar digitos, ou terei de voltar á solução antiga do do {...}(while n > '9' && n< '0') ??? Já agora referir que gostei da solução por apresentada do: while (!scanf("%d", &n)); Muito obrigado mesmo pela ajuda prestada. Abraço Edited February 8, 2016 at 06:09 PM by Inacabado Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted February 8, 2016 at 06:16 PM Report Share #593277 Posted February 8, 2016 at 06:16 PM o scanf apresentado lê um valor numérico inteiro, logo não necessitas de fazer nenhuma verificação. ps : cuidado com o último pedaço de código que colocaste porque se a entrada for mal formatada, entras num ciclo infinito IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now