Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Igor Rafael Oliveira

Condição While em C

Recommended Posts

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

Compartilhar este post


Link para o post
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..

Compartilhar este post


Link para o post
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'.

Editado por isrnick
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 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.

     

    Compartilhar este post


    Link para o post
    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.

    Editado por isrnick

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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!!!

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×