Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Usando a função gets() na linguagem C

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    Usando a função gets() na linguagem C

    Boa noite galerinha..

    estou com um problema nesse algoritimo abaixo onde o mesmo não funciona a função gets, como estou tentando fazer um menu esse algoritimo abaixo é apenas um exemplo porque quando utilizo a função gets ele não me deixa escrever o nome simplismente apenas mostra minha pergunta e a resposta sem eu ao menos ter digitado nada.
    E em seguindo um erro mostra que a função gets não está funcionando.
    Alguém poderia ajudar.
    Estou usando windows 7.


    Código:
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    
    int main()
    {
        int num1, num2, valor;
        int A;
        char nome [51];
    
        printf("\n\n\tALGORITIO DE TESTE...\n\n");
        printf("[1] > PARA CADASTRO: \n");
        printf("\n[2] > PARA CALCULO ARITIMETICO: \n");
        scanf("%d",&A);
        switch(A){
    
    case 1:
        printf("\nNOME DO USUARIO: \n");
        gets(nome);
        printf("O NOME DIGITADO:> %s\n\n", nome);
    
            break;
    
    case 2:
    
            printf("CALCULO ARITIMETICO...\n");
            printf("\nDIGITE UM VALOR: ");
            scanf("%d", &num1);
            printf("\nDIGITE OUTRO VALOR: ");
            scanf("%d", num2);
    
            valor = num1 + num2;
            printf("\nO VALOR DIGITADO FOI: %d\n", valor);
                break;
    
        }
    
    
        system("pause");
        return 0;
    }

  • Font Size
    #2
    O gcc desencoraja o uso de gets . A própria man page de gets declara o seguinte em sua seção PROBLEMAS :

    PROBLEMAS
    Nunca use gets(). Porque é impossível saber, sem conhecer antecipada*
    mente os dados, quantos caracteres gets() vai ler, e porque gets() vai
    continuar a guardar caracteres ultrapassado o fim do 'buffer', ela é
    extremamente perigosa de usar. Este comportamento tem sido utilizado
    para quebrar a segurança de computadores. Use fgets() no seu lugar.


    fgets(STRING,TAMANHO,STREAM);

    onde:

    STRING é a variável onde a string será armazenada
    TAMANHO é o tamanho máximo da string
    STREAM é de onde os caracteres serão lidos, para ler do teclado o valor padrão para isto é stdin

    Fonte: Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...


    Eu particularmente recomendo o uso do scanf "scanf("%s", nome);" , mas caso queira insistir com o gets use fgets.
    __________________________________________________ ____
    Quem pensa antes tem tempo pra pensar, pois não precisa pensar durante ou depois.

    Comment


    • Font Size
      #3
      Tópico ja é antigo, mas quem sabe não ajuda alguém!?

      Como o sujeito citou ai em cima o gets(); realmente é perigoso, pois o próprio gcc da um warning quando se usa o gets();
      Porém no caso deste código citado, mesmo usando o scanf(); o problema vai persistir, porque na entrada de dados ta pegando o enter como buffer do teclado.
      Eu testei aqui tanto com o gets(); como scanf(); e o problema persistia então usei o setbuf(stdin, NULL); apos as funções de leitura(gets ou scanf) e o problema foi solucionado.


      setbuf(stdin, NULL) = quando se usa isso acontece o seguinte, após digitar a variavel o computador pega um valor null e coloca no buf evitando assim que o enter seja reconhecido como uma entrada de dados.

      OBS: Usei o gcc para a compilação.
      Falar é fácil, me mostre o código.


      Comment


      • Font Size
        #4
        Se você usar o fgets você pode declarar o tamanho do buffer, aí não é tão problemática em questões de overflow, mas ainda assim se não filtrar certinho vai sem dúvida ter overflow.
        Yes, I am a criminal. My crime is that of curiosity. My crime is
        that of judging people by what they say and think, not what they look like.
        My crime is that of outsmarting you, something that you will never forgive me
        for.

        I am a hacker, and this is my manifesto. You may stop this individual,
        but you can't stop us all... after all, we're all alike.

        Comment


        • Font Size
          #5
          Como já foi dito, o tópico é antigo, mas como tive bastante experiência com isso, vim compartilhar um pouco de conhecimento.

          É o seguinte, esse problema acontece por que no buffer do teclado são guarda informações do que foi digitado pela última vez. E tem duas soluções para isso:

          Use fflush(stdin); Esse comando limpa o buffer do teclado:

          Código:
          printf("\nNOME DO USUARIO: \n");
          fflush(stdin);
          gets(nome);
          printf("O NOME DIGITADO:> %s\n\n", nome);
          Ou use scanf(" %[^\n]",nome), ele lê a string até o usuário apertar enter. Além de permitir a inserção de espaço na string, por exemplo: "Joao e Maria"


          Código:
          printf("\nNOME DO USUARIO: \n");
          scanf(" %[^\n]", nome);
          printf("O NOME DIGITADO:> %s\n\n", nome);
          Se fui útil não custa nada agradecer clicando em obrigado
          sigpic

          Comment

          X
          Working...
          X