Ir ao conteúdo
  • Cadastre-se

C Condição While em C


Posts recomendados

Por favor me ajudem, estou tentando desenvolver um código em C com a condição while mas ele pula comandos ao executar, queria saber o que estou fazendo errado

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

int main()
{
    int i , s;
    char l='s';
    i=0;
    s=0;
    while(l=='s')
    {
    printf("Inserir numero:");
    scanf("%i", &i);
    printf("Continuar?\n");
    scanf("%c", &l); //O código pula esta função e encerra a condição na primeira vez que executa a condição
s=s+i;
    }
    printf("Soma = %i", i);
    return 0;
}

 

obs: Ja tentei substituir a condição 's' por algo numérico e funcionou

Captura de Tela (7).png

Link para o comentário
Compartilhar em outros sites

faça um teste rápido.. troque o tipo de I, de char para boolean.. inicializa com true e veja se entra no laço.. não me lembro muito de c mas sei que ele é meio chatinho com comparações, ainda mais com strings.. 

 

uma dica.. procura uma ide com debbuger... ai fica mais saber qual o problema..

Link para o comentário
Compartilhar em outros sites

Sempre use a tag CODE, apertando o botão <> no topo do campo de resposta, para postar códigos, pois assim você mantém a formatação do código, e evita que o autocorretor do fórum faça alterações no texto do seu código...

 

 

Quanto a sua pergunta, o problema está na entrada dos dados, quando você digita por exemplo o número 123 e aperta ENTER, o que está sendo passado para a entrada padrão (stdin) é a string "123\n", onde '\n' representa o caractere nova linha em C, e esse caractere foi inserido quando você apertou o botão ENTER.

 

O scanf por sua vez que obter dessa entrada um número inteiro inteiro (scanf("%i", &i);), então ele pega da entrada a parte relevante "123" e deixa na entrada o que sobrou, nesse caso o caractere '\n'.

 

Por sua vez, o próximo scanf no seu programa que obter um caractere (scanf("%c", &l);), mas já existe um caractere digitado na entrada padrão, o caractere '\n', então esse caractere é armazenado na variável l, e como l agora é diferente de 's' o programa sai do ciclo while e o programa é concluído.

 

Uma maneira de tratar isto seria fazer o primeiro scanf descartar o '\n', modificando-o para esperar um número inteiro seguido de um caractere nova linha, como: scanf("%i%*c", &i);

 

Isso excluiria o caractere nova linha da entrada padrão, e resolve o problema, mas observe que isso apenas trata a hipótese do usuário entrar um valor adequado, ou seja o usuário é bem comportado, mas se ao invés disto forem digitados o número e outros caracteres na entrada e só então for dado ENTER (ex: "123 blablabla\n"), ou for digitado algo que não seja um número, o programa se comportará de forma inesperada, pois o programa não lida com estas hipóteses. Um programa mais avançado precisaria analisar a validar a entrada antes de usá-la, e tratar os possíveis erros, mas isso ainda não é algo com que você precisa lidar.

 

Outra solução seria excluir qualquer coisa que reste na entrada padrão depois que você obteve o dado relevante, com algo desse tipo:

 

scanf("%i", &i);
/*Lê e descarta todos os caracteres que ainda estiverem na entrada 
padrão até encontrar '\n' ou encontrar o fim do arquivo/stream/fila: */
while((c = getchar()) != '\n' && c != EOF);

(Isso resolve o problema do usuário digitar algo além do esperado, mas ainda não trata a hipótese do usuário digitar algo completamente inválido. Para mais informações sobre isso pesquise sobre validação de entrada (input validation) em C.)

 

 

 

EDIT: Correção no scanf para descartar o caractere '\n'.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

9 horas atrás, isrnick disse:

Sempre use a tag CODE, apertando o botão <> no topo do campo de resposta, para postar códigos, pois assim você mantém a formatação do código, e evita que o autocorretor do fórum faça alterações no texto do seu código...

 

 

Quanto a sua pergunta, o problema está na entrada dos dados, quando você digita por exemplo o número 123 e aperta ENTER, o que está sendo passado para a entrada padrão (stdin) é a string "123\n", onde '\n' representa o caractere nova linha em C, e esse caractere foi inserido quando você apertou o botão ENTER.

 

O scanf por sua vez que obter dessa entrada um número inteiro inteiro (scanf("%i", &i);), então ele pega da entrada a parte relevante "123" e deixa na entrada o que sobrou, nesse caso o caractere '\n'.

 

Por sua vez, o próximo scanf no seu programa que obter um caractere (scanf("%c", &l);), mas já existe um caractere digitado na entrada padrão, o caractere '\n', então esse caractere é armazenado na variável l, e como l agora é diferente de 's' o programa sai do ciclo while e o programa é concluído.

 

Uma maneira de tratar isto seria fazer o primeiro scanf descartar o '\n', modificando-o para esperar um número inteiro seguido de um caractere nova linha, como: scanf("%i\n", &i);

 

Isso excluiria o caractere nova linha da entrada padrão, e resolve o problema, mas observe que isso apenas trata a hipótese do usuário entrar um valor adequado, ou seja o usuário é bem comportado, mas se ao invés disto forem digitados o número e outros caracteres na entrada e só então for dado ENTER (ex: "123 blablabla\n"), ou for digitado algo que não seja um número, o programa se comportará de forma inesperada, pois o programa não lida com estas hipóteses. Um programa mais avançado precisaria analisar a validar a entrada antes de usá-la, e tratar os possíveis erros, mas isso ainda não é algo com que você precisa lidar.

 

Outra solução seria excluir qualquer coisa que reste na entrada padrão depois que você obteve o dado relevante, com algo desse tipo:

 


scanf("%i", &i);
/*Lê e descarta todos os caracteres que ainda estiverem na entrada 
padrão até encontrar '\n' ou encontrar o fim do arquivo/stream/fila: */
while((c = getchar()) != '\n' && c != EOF);

(Isso resolve o problema do usuário digitar algo além do esperado, mas ainda não trata a hipótese do usuário digitar algo completamente inválido. Para mais informações sobre isso pesquise sobre validação de entrada (input validation) em C.)

Eu tentei apenas remover o \n como você disse e não funcionou, já executei esse código antes praticamente desta forma, sem usar nada do exemplo que citou, apenas usando comandos que eu utilizei no meu código.

 

adicionado 12 minutos depois
10 horas atrás, isrnick disse:

Sempre use a tag CODE, apertando o botão <> no topo do campo de resposta, para postar códigos, pois assim você mantém a formatação do código, e evita que o autocorretor do fórum faça alterações no texto do seu código...

 

 

Quanto a sua pergunta, o problema está na entrada dos dados, quando você digita por exemplo o número 123 e aperta ENTER, o que está sendo passado para a entrada padrão (stdin) é a string "123\n", onde '\n' representa o caractere nova linha em C, e esse caractere foi inserido quando você apertou o botão ENTER.

 

O scanf por sua vez que obter dessa entrada um número inteiro inteiro (scanf("%i", &i);), então ele pega da entrada a parte relevante "123" e deixa na entrada o que sobrou, nesse caso o caractere '\n'.

 

Por sua vez, o próximo scanf no seu programa que obter um caractere (scanf("%c", &l);), mas já existe um caractere digitado na entrada padrão, o caractere '\n', então esse caractere é armazenado na variável l, e como l agora é diferente de 's' o programa sai do ciclo while e o programa é concluído.

 

Uma maneira de tratar isto seria fazer o primeiro scanf descartar o '\n', modificando-o para esperar um número inteiro seguido de um caractere nova linha, como: scanf("%i\n", &i);

 

Isso excluiria o caractere nova linha da entrada padrão, e resolve o problema, mas observe que isso apenas trata a hipótese do usuário entrar um valor adequado, ou seja o usuário é bem comportado, mas se ao invés disto forem digitados o número e outros caracteres na entrada e só então for dado ENTER (ex: "123 blablabla\n"), ou for digitado algo que não seja um número, o programa se comportará de forma inesperada, pois o programa não lida com estas hipóteses. Um programa mais avançado precisaria analisar a validar a entrada antes de usá-la, e tratar os possíveis erros, mas isso ainda não é algo com que você precisa lidar.

 

Outra solução seria excluir qualquer coisa que reste na entrada padrão depois que você obteve o dado relevante, com algo desse tipo:

 


scanf("%i", &i);
/*Lê e descarta todos os caracteres que ainda estiverem na entrada 
padrão até encontrar '\n' ou encontrar o fim do arquivo/stream/fila: */
while((c = getchar()) != '\n' && c != EOF);

(Isso resolve o problema do usuário digitar algo além do esperado, mas ainda não trata a hipótese do usuário digitar algo completamente inválido. Para mais informações sobre isso pesquise sobre validação de entrada (input validation) em C.)

Eu tentei apenas remover o \n como você disse e não funcionou, já executei esse código antes praticamente desta forma, sem usar nada do exemplo que citou, apenas usando comandos que eu utilizei no meu código.

 

Link para o comentário
Compartilhar em outros sites

Você está certo, eu errei, para descartar um caractere deve-se usar %*c no scanf (onde o * é usado para indicar que o valor lido não é armazenado em nenhuma variável, ou seja, é lido e descartado). Ficando assim: scanf("%i%*c", &i);

 

(Editei e corrigi meu post original para colocar a forma correta.)

 

E no fim do seu programa o valor a ser impresso é o valor da variável s, que é onde está armazenada a soma, não da variável i.

Link para o comentário
Compartilhar em outros sites

22 horas atrás, isrnick disse:

Você está certo, eu errei, para descartar um caractere deve-se usar %*c no scanf (onde o * é usado para indicar que o valor lido não é armazenado em nenhuma variável, ou seja, é lido e descartado). Ficando assim: scanf("%i%*c", &i);

 

(Editei e corrigi meu post original para colocar a forma correta.)

 

E no fim do seu programa o valor a ser impresso é o valor da variável s, que é onde está armazenada a soma, não da variável i.

Deu certo sim, muito obrigado, coisa tão simples mas que me fez quebra cabeça, e não encontrei em lugar nenhum. valeu!!!

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...