Ir para conteúdo
Fórum Script Brasil
  • 0

Como funciona esse código?


Mako

Pergunta

Olá pessoal, já conhecia o fórum e sempre usei para pesquisar, mas hoje estou precisando de uma ajudinha. Sou iniciante e estou começando a aprender C. Com um certo conhecimento que adquiri, decidi criar uma calculadora, os cálculos são feitos corretamente, tudo funciona, mas estou implemento funções que verifica se tal valor é correto.

O programa pede para digitar um inteiro, mas se uma letra é digitada, no caso a função scanf falha. Pesquisando um pouco eu achei esse código em um fórum gringo, apenas implementei o goto para repetir os comandos:

#include <stdio.h> 

  int main()
    {
      char buffer[200];
      char *nao_inteiro;
      int num;
  GO: printf ("\nDigite um número: ");
      scanf ("%s", buffer); 
      num = strtol(buffer, &nao_inteiro, 10);
      if (*nao_inteiro != '\ 0')
        {
          printf ("\nValor inválido!");
          goto GO;
        }
      printf ("\nVocê digitou o número: %d\n", num);
      return (0);
    }

O código funciona, mas se alguém puder explicar como ele funciona seria interessante, ta certo que o código para mim agora pode ser confuso mas queria saber como funciona, porque tentei aqui e não consegui resolver de uma maneira mais simples.

Editado por Mako
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Olá Mako,

A função strtol converte um numero em formato texto para um "long".

Ela interrompe a conversão quando encontra um caracter que não corresponda aos padrões esperados para a conversão.

Por exemplo, se o radix for 16 (conversão para hexadecimal) você pode ter um letras de A a F e x (opcional), mas se o a base (radix) for 10 , só podem haver numeros, sinais (+ ou -).

Em nao_inteiro você tem a posição onde a funcao encerrou a conversão, por exemplo.

String                             nao_inteiro
"123456\ 0"                        \ 0
"123a45"                            a
"b45778"                            b
"123,45"                             ,

Então, se você executa strol e o conteudo de nao_inteiro for diferente de "\ 0" significa que havia um caracter não valido na sua string.

Mas, considere que "1B45" é uma string valida na base 16 e por isso o nao_inteiro vai estar como "\ 0" no final.

Espero ter ajudado.

Abs

Editado por CPP
Link para o comentário
Compartilhar em outros sites

  • 0
Olá Mako,

A função strtol converte um numero em formato texto para um "long".

Ela interrompe a conversão quando encontra um caracter que não corresponda aos padrões esperados para a conversão.

Por exemplo, se o radix for 16 (conversão para hexadecimal) você pode ter um letras de A a F e x (opcional), mas se o a base (radix) for 10 , só podem haver numeros, sinais (+ ou -).

Em nao_inteiro você tem a posição onde a funcao encerrou a conversão, por exemplo.

String                             nao_inteiro
"123456\ 0"                        \ 0
"123a45"                            a
"b45778"                            b
"123,45"                             ,

Então, se você executa strol e o conteudo de nao_inteiro for diferente de "\ 0" significa que havia um caracter não valido na sua string.

Mas, considere que "1B45" é uma string valida na base 16 e por isso o nao_inteiro vai estar como "\ 0" no final.

Espero ter ajudado.

Abs

Valeu mesmo CPP, pela sua atenção em explicar. Com certeza foi de grande ajuda.

Abs.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...