Ir ao conteúdo

Problemas com o retorno do scanf()


Washing7on

Posts recomendados

Postado

Meu código:

int main(void){
int d, f, g;
while(scanf("%d %d %d", &d, &f, &g)!=-1){
printf("Foram lidos os valores %d, %d, %d\n\n", d, f, g);
}
printf("\n\nNao foi lido nenhum valor\n");
getch();
return 0;
}

A ideia é simples, quando o usuário digitar os tres valores eu vou fazer o que tiver que fazer com eles...

Quando o usuário não tiver mais valores para digitar deve encerrar o programa.

O problema é que esse trecho de código não está funcionando:

while(scanf("%d %d %d", &d, &f, &g)!=-1)

Alguém sabe o que pode ser?

Eu uso o Dev-C++ 4.9.9.2 para fazer esses programas em C.

Postado

Não sei se entendi bem, mas seria isso?

int main(void){

int d, f, g;

while(d != -1 && f !=-1 && g!= -1){

scanf("%d %d %d", &d, &f, &g);

if (d != -1 && f !=-1 && g!= -1){

printf("Foram lidos os valores %d, %d, %d \n\n", d, f, g);

}else{

break;

}

}

printf("\n\nNao foi lido nenhum valor\n");

getch();

return 0;

}

Postado

Não, não é isso.

Deixa eu tentar explicar melhor:

quando eu fiz a comparação com o "-1" eu me referi a quantidade de variáveis que foi lida.

Se o usuário digitar -1 -1 -1 (foram lidas 0-1-2 variáveis totalizando 3) não é pra encerrar o programa, deve continuar, até porque o -1 é um valor válido.

Ele deve encerrar quando:

O programa estiver esperando para ler os três valores, mas a pessoa der um simples enter.

Postado

...

int main(void){

int d, f, g;

while(d != -1 && f !=-1 && g!= -1){

scanf("%d %d %d", &d, &f, &g);

if (d != -1 && f !=-1 && g!= -1){

...

}

Olá amigo,

Não querendo ser chato, mas.. você não estaria comparando lixo de memória dentro do loop? ^_^

Forte abraço.

Não, não é isso.

Deixa eu tentar explicar melhor:

...

O programa estiver esperando para ler os três valores, mas a pessoa der um simples enter.

Olá amigo,

O que você deseja, chama-se validação...

// while(d != -1 && f !=-1 && g!= -1){

É mais didático, você receber os três valores separados, e dessa forma

fica simples validar se o usuário vai apenas digitar um Enter...

Façamos assim:

//Cod Teste v.01.0 MS VSExpress 2010 4.0.30.319

#include <stdio.h>

#include <stdlib.h>

int main(){

int d = -1, f = -1, g = -1; //inicialização com valores previos, evitando lixo nas variaveis

printf("\n Informe 3 numeros validos maiores ou iguais a 0! \n");// O usuario precisa saber o que você pede...

while(d >= -1 && f >= -1 && g >= -1){ //validação

printf("\n Informe um valor inteiro >>");

scanf("%i",&d);fflush(stdin);

printf("\n Informe um valor inteiro >>");

scanf("%i",&f);fflush(stdin);

printf("\n Informe um valor inteiro >>");

scanf("%i",&g);fflush(stdin);

break;

}

// Obs¹:fflush(stdin) apenas esvazia o 'buffer', evitando erros em tempo de execução.

// Obs²: x = x + 1 é algo como x++ ou ++x ou mesmo x+=, ou seja, é um contador inteiro

printf("\n\n\n");//Apenas pulando linhas

printf("\n Valores informados: >> [%i] , [%i] , [%i] \n\n\n",d,f,g);

system("pause");// Para facilitar a exibição em tela, se não os valores vão ser exibidos muito rapidamente na tela por 1 seg...

return 0;

}

Espero ter ajudado, apesar de que colocar o código pronto também não é o ideal. Se possível transforme as três variáveis para um vetor de inteiros, se você já souber trabalhar com arrays.

Apesar de o código não sair com indentação, podemos observar como seria a recepção de valores, pois o programa ficará a espera de um valor mesmo que o usuário só digite... Enter.

Outra dica, não use o o DevC++, pois é quase um brinquedo, muitas vezes o código está correto e o mesmo não compila, use o Visual Studio 2008 ou 2010 Express no site do MSDN da Microsoft, pois

é grátis, basta apenas registrar-se após instalar o mesmo, através do menu help, usando sua conta no Outlook/Hotmail.

Se desejar uma dica de como usá-lo, estamos aqui para tal.

Forte abraço e até mais.^_^

Postado

Heitor Borba, obrigado pelas dicas...

Eu estava pesquisando pelo google e achei esse jeito que "deveria arrumar" meu problema:

while(scanf("%d %d %d", &d, &f, &g)!=EOF)

Mas também não está funcionando.

>

>

>

Eu consegui um exemplo que funciona do jeito que eu quero, mas é usando a função gets(), que no meu caso não ajuda porque são três inteiros.

O código com gets() é assim:

/* Exemplo funcionando com gets() */

int main(void){
int a;
char variavel[50];
gets(variavel);
while(variavel[0]!='\0'){
printf("Foi lido... %s\n\n", variavel);
for(a=0; a<20; a++) // esse for é para
variavel[a] = '\0'; // limpar a variável
gets(variavel);
}
printf("\n\nNao foi lido nenhuma variavel... programa encerrado\n");
getch();
return 0;
}

O que eu quero é fazer o programa funcionar assim como o exemplo, mas ao invés de ler uma string, ele tem que ler três inteiros.

Postado

Olá prezado,

Acho que o que você deseja, é receber as variáveis sem apertar o Enter a cada entrada de dado, ou seja, você digita o numero inteiro, outro e outro, sem enter... e isso o getch faz, porém só o faz para um caractere por vez...

Gets é uma função da biblioteca string.h que significa get string, algo como receba meu vetor de caracteres completo, inclusive com espaços em branco. Vetor de caracteres são frases, palavras, símbolos, e até números( são recebidos como caracteres, caractere '1', '2' e etc).

Resumindo, você pode usar um vetor de caracteres para receber seus três números como caractere e usar uma função para converter esses caracteres dentro da string( se não me engano a função que faz isso chama-se itoa() ou atoi() ) em valores numéricos novamente guardando-os em outra vetor só que de inteiros desta vez.

Se ficou complicado, depois faço um exemplo com seu código acima, só não faço agora, porque estou ,meio sem tempo..

Até mais.

Postado

Heitor Borba, obrigado de novo...

Acho que sim, essa função [itoa)(atoi] deve resolver meu problema, mas como ficaria com três valores?

Eu tentei transformar a partir da string, mas não consegui:

int main(void){

char variavel[50];
gets(variavel); // vamos supor que a entrada sejam tres numeros "3 1 2"

int numeros[3];
atoi(variavel, numeros);

printf("%d %d %d", numeros[0], numeros[1], numeros[2]);
getch();
return 0;
}

Postado

...

char variavel[50];

gets(variavel); // vamos supor que a entrada sejam tres numeros "3 1 2"

...

Olá amigo,

Antes de continuarmos, assista a esta aula de vetores, vai facilitar bastante para você.^_^

Obs: Não sou o autor dos vídeos, porém admiro o trabalho prestado no YouTube.

[ame=

]
[/ame]

Até mais.

Postado

Desculpe, acho que não expliquei bem... não é o vetor o problema.

Eu tenho o seguinte código de exemplo:

int main(void){

char teste[] = "17";
char variavel[] = "10 20 15";

int testando, numeros[3];

testando = atoi(teste);
printf("%d\n", testando);

atoi(variavel, numeros);
printf("%d %d %d", numeros[0], numeros[1], numeros[2]);

getch();
return 0;
}

Se testar o código acima, a função atoi funcionou quando teve converter uma string, no caso "17" para um inteiro. Mas quando eu peguei outra string "10 20 15"... o que eu tinha em mente após a funço atoi ser executada era que ficasse:

numeros[0] = 10;

numeros[1] = 20; e

numeros[2] = 15.

Mas não aconteceu isso, e eu não sei como arrumar.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!