Ir ao conteúdo

C tipos de input em C


Ir à solução Resolvido por Lucca Rodrigues,

Posts recomendados

Postado

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)

  • Solução
Postado
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
Postado
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
Postado
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
Postado
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
Postado

@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
Postado

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

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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!