Ir ao conteúdo
  • Cadastre-se

C tipos de input em C


Ir à solução Resolvido por Lucca Rodrigues,

Posts recomendados

estava pesquisando e vi que além de scanf e cout existe ainda gets e fgets...

 

qual a principal diferença entre eles?

qual o melhor para se usar?

qual deles não corre risco/atenua o risco de buffer overflow e como reage a excesso de caracteres?

e como fazer para ter entrada de apenas um caractere? (tipo eu aperto 'a' e é enviado direto para o programa, sem precisar esperar por um enter)

Link para o comentário
Compartilhar em outros sites

  • Solução
34 minutos atrás, Um mero usuário disse:

qual a principal diferença entre eles?

scanf() é pra ler dados formatados.

cout é do c++, controla inserções na saída.

gets() é pra ler uma string da stdin com a possibilidade de ocasionar um buffer overflow, é obsoleta.

fgets() é pra ler uma string de um fluxo.

A semelhança é que todos te possibilitam ler alguma coisa, exceto cout :)

 

34 minutos atrás, Um mero usuário disse:

qual o melhor para se usar?

Você usa uma função quando precisa que uma tarefa específica seja realizada, e existem várias outras funções com o mesmo propósito além dessas que você citou.

fgets() é convenientemente usada para ler strings, pois esse é o propósito da mesma.

scanf() é normalmente usada nesses programas interativos pra ler dados do teclado, embora seu uso não se restrinja a isso...

 

34 minutos atrás, Um mero usuário disse:

qual deles não corre risco/atenua o risco de buffer overflow e como reage a excesso de caracteres?

A questão é saber usar aquelas funções, todas tem esse risco se você não souber usar.

Aliás, não use a gets(), essa não tem como evitar mesmo :D

 

34 minutos atrás, Um mero usuário disse:

e como fazer para ter entrada de apenas um caractere? (tipo eu aperto 'a' e é enviado direto para o programa, sem precisar esperar por um enter)

Em Windows, basta desabilitar Line Input, use SetConsoleMode().

Em Linux, desabilite Cooked Mode.

Depois disso, você pode usar fgetc(), getchar(), etc. E daí é só restaurar para o modo original.

Isso já foi discutido algumas vezes aqui no fórum, dê uma olhada e acompanhe a discussão:

 

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

1 hora atrás, Um mero usuário disse:

estava pesquisando e vi que além de scanf e cout existe ainda gets e fgets...

 

 

Tem dois problemas com cout: não existe em C e não se trata de input.

 

Em C++ usaria cin.

 

1 hora atrás, Lucca Rodrigues disse:

A semelhança é que todos te possibilitam ler alguma coisa

 

E que tal read() o clássico read para ler? :D nunca pensei em NÃO ver read() em uma lisa de funções de entrada.

 

E fgetc()? Algo errado com fgetc() para ler letrinhas?

 

 

 

 

 

 

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

16 minutos atrás, Um mero usuário disse:

read

 

read é ler. O comando primário para ler, em C, FORTRAN, COBOL, java, Pascal... 

 

sugiro ler o tópico que @Lucca Rodrigues indicou. Eu postei exemplos e expliquei como funciona isso em Windows e Unix/Linux/Mac e acho que lá tem outras discussões também.

 

Se está usando Windows e a console pode ler direto do buffer de teclado. Ou pode usar SetConsoleMode e desligar LINE_INPUT. 

 

Se não fizer isso qualquer entrada em Windows e Unix via teclado será condicionada à tecla ENTER, você nunca vai ler um backspace por exemplo, já que o sistema não vai passar nada para a aplicação antes de um ENTER

 

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

13 minutos atrás, Um mero usuário disse:

mas fui procurando por algo mais direcionado

lá tem um exemplo de como fazer isso para Windows em C, completo...

 

Postei um programa que cria menus em C e C++ e usa uma técnica parecida. Está aqui nesse forum também. Tem uma ferramenta de pesquisa.

 

 

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

@Um mero usuário     essa Questao de nao precisar teclar enter eh resolvida usando a biblioteca

#include <conio.h>

da linguagem C , que funciona bem em muitos compiladores , assim :

int main()

{

    int g;

    printf("Tecle ESC para sair");

    do

    {

        g = getch();// espera teclar algo

                            // e prossegue sem  digitar enter

        printf("Teclou a Letra  %c\n",(char)g);

    }while(g != 27);

    return 0;

}

mas no visual studio precisa inserir esse 

#define getch()  _getch();

e tem tambem a funcao   :

kbhit();// se em um loop ,  fica lendo o teclado enquanto segue o programa sem parar

// e se pressionar alguma tecla   use o comando :

tecla = getch();

para sabet Qual botao do teclado  foi pressionado

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

Uma alternativa se você utilizar linux seria a ncurses.

 

exemplo

#include <ncurses.h>
#include <ctype.h>
#include <unistd.h>

struct vetor2
{
    int x, y;
};

int main(void)
{
    int tecla;
    struct vetor2 vetor = {1, 1};
    initscr();      /* inicia a ncurses */
    noecho();       /* Não deixa o caractere pressionado aparecer */
    cbreak();       /* Não espera que seja pressionado enter */
    do {
        clear();    /* Apaga a tela */
        printw("Utilize as teclas WASD para se mover, e X para sair\n");
        tecla = getch();    /* pega uma tecla */
        
        switch (toupper(tecla)) {
            case 'A':
                if (vetor.x > 0) {
                    vetor.x--;
                } else {
                    vetor.x = 79;
                }
                break;
                
            case 'D':
                if (vetor.x < 79) {
                    vetor.x++;
                } else {
                    vetor.x = 0;
                }
                break;
                
            case 'W':
                if (vetor.y > 0) {
                    vetor.y--;
                } else {
                    vetor.y = 20;
                }
                break;
                
            case 'S':
                if (vetor.y < 20) {
                    vetor.y++;
                } else {
                    vetor.y = 0;
                }
                break;
        }
        
        move(vetor.y, vetor.x);
        printw("#");
        
        refresh();  /* Atualiza a tela */
        usleep(50000);  /* Faz uma pausa de 50 msec */
    } while (toupper(tecla) != 'X');
    endwin();       /* finaliza a ncurses */
    return(0);
}

 

para ver o funcionamento do programa.

https://onlinegdb.com/m-r5HCBGB

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

17 horas atrás, kgin disse:

Uma alternativa se você utilizar linux seria a ncurses.

 

exemplo


#include <ncurses.h>
#include <ctype.h>
#include <unistd.h>

 

para ver o funcionamento do programa.

https://onlinegdb.com/m-r5HCBGB

só nao entendi o que aquelas bibliotecas (ctype.h e unistd.h) fazem... mas obrigado, já consigo tirar uma boa base :) vou dar uma olhada na documentação :)

@devair1010 obrigado pela explicação

pena q nn dá para escolher mais de uma solução... se desse ia ter umas 4 aqui hahahahah

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

2 horas atrás, Um mero usuário disse:

só nao entendi o que aquelas bibliotecas (ctype.h e unistd.h) fazem...

ctype trabalha com caracteres, faz conversões de maiúscula para minuscula (e vice versa), checa se um caractere e um numero ou um gráfico (caracteres gráficos !,@,°,E,...).

 

já o unistd está aí só para dar um delay com a função usleep (eu poderia ter usado sleep() também).

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

Mas se estamos falando de funções de entrada da linguagem C em termos das funções que oficialmente fazem parte do padrão da linguagem, o melhor seria consultar um site de documentação da linguagem como https://en.cppreference.com/w/c/io , ou então ler a norma ISO mais recente da linguagem diretamente.

 

Estas são as funções que oficialmente devem estar disponíveis em qualquer compilador que seja conformante com as normas que definem a linguagem C.

 

Outras funções que não sejam definidas na norma dependem do sistema operacional e/ou da disponibilidade de bibliotecas de terceiros. (Exemplos destas que foram mencionados aqui: read, funções da biblioteca Curses como getch, etc)

 

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

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!