Jump to content
Sign in to follow this  
carlos870

Dúvida C

Recommended Posts

carlos870

Boas.

Suponham o seguite código.

int a;

scanf(" %d",&a);

while (a!=1)

{

    scanf(" %d",&a);

}

O programa repete infinitamente até eu introduzir o '1'.

Mas caso eu introduza um caracter, o programa crasha.

Como posso resolver isto de maneira a que independentemente da tecla em que carregue (à excepção do '1') ele esteja sempre a repetir?

Share this post


Link to post
Share on other sites
daj

O programa fica bloqueado porque nenhum dos scanf consome o carácter introduzido, ficando este sempre no buffer. Porque não algo como

char c;
// ...
do {
  scanf("%c", &c);
} while (c != '1');
// ...

?

Share this post


Link to post
Share on other sites
carlos870

Mas assim vou ter outro problema.

Se eu meter, por exemplo, "gdy1dshf", o programa termina porque vê que eu introduzi o "1".

Eu queria que o programa terminasse quando eu introduzisse apenas o "1".

Share this post


Link to post
Share on other sites
rjfs

Experimenta a usar um vector e a aceitar resultados para apenas quando o strlen é menor que 2.

Share this post


Link to post
Share on other sites
daj

Para o que queres não te sei dizer se já existe suporte com alguma função da biblioteca standard. Andei para aqui a brincar com o problema e cheguei a isto:

int d;
char c;

while (scanf("%d%c", &d, &c) != 2 || (c != '\r' && c != '\n') || d != 1)
while (scanf("%c", &c) && c != '\r' && c != '\n');

Para uma versão menos compacta da ideia:

int d, res;
char c;

while (1) {
res = scanf("%d%c", &d, &c);
if (res != 2 || (c != '\r' && c != '\n'))
	while (scanf("%c", &c) && (c != '\r' && c != '\n'));
else if (d == 1) break;
}

Isto fui eu a divertir-me mas pode ser que te sirva para alguma coisa. Eventualmente alguém com mais conhecimentos deixará uma mensagem aqui na discussão a referir uma forma melhor.

Share this post


Link to post
Share on other sites
Baderous

Como posso resolver isto de maneira a que independentemente da tecla em que carregue (à excepção do '1') ele esteja sempre a repetir?

Podes usar o valor de retorno do scanf. O scanf retorna o nº de atribuições realizadas com sucesso, ou seja, o número de variáveis que foram afectadas com valores do seu tipo (um inteiro lido para uma variável do tipo int, float para um float, etc). Pelo que o teu código pode ficar assim:

#include <stdio.h>

int main(void) {
        int x, v;
        v = scanf("%d",&x);
        while (v<1 || x!=1) {
                scanf("%*c"); //limpar o '\n' que fica no buffer
                v = scanf("%d",&x);
        }
        printf("%d\n",x);
        return 0;
}

Share this post


Link to post
Share on other sites
joao.palma

facil, acho eu não analisei mt bem, mas podes fazer o seguinte:

tu queres que insira apenas "1"?

certo?

"1" igual a 1 caracter

"abc1xyz" igual a 7 caracteres!!

logo é so contares os caracteres!!!

se tiver 1 e esse 1 for "1" termina!!

edit--------

as condiçoes são contar(a)=1 e a=1

axo k podes utilizar a função strlen se não poderes fazes um ciclo! com incrementador!

espero ter ajudado

Share this post


Link to post
Share on other sites
filipe3632

Fazes um ciclo for de uma maneira que se adeque...

E crias uma variável contador, ou um array...

E depois crias a condição que queres que neste caso é quando se carrgar 1  e só um o programa termina.... Ou então fazes de maneira diferente em vez de ser o um a terminar e usas o Getchar para o enter e termina quando carregas no enter...

Não sei se fui explicito, espero ter ajudado

Cumprimentos


Peace, Love & Empathy by: Kurt Cobain

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
Sign in to follow this  

×
×
  • 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.