Pergunta

Estou confuso sobre getchar()o papel do código a seguir. Quero dizer, eu sei que está me ajudando a ver a janela de saída que só será fechada quando eu pressionar o Digitar chave.

Então getchar() está basicamente esperando que eu pressione Enter e depois lê um único caractere.

O que é esse personagem único, essa função é a leitura? Não pressionei nenhuma tecla do teclado para ler.

Agora, quando não está lendo nada, por que não dá um erro dizendo "Ei, você não entrou em nada para eu ler"?

#include <stdio.h>

int main()
{
    printf( "blah \n" );
    getchar();
    return 0;
}
Foi útil?

Solução

o getchar() A função simplesmente espera até receber um personagem, mantendo o programa até que ele aconteça.

Um personagem é enviado quando você atinge a tecla Enter; Sob um sistema operacional Windows, ele enviará um retorno de carruagem (CR) e uma alimentação de linha (LF).

Ver Esta postagem de codinghorror para uma explicação bem colocada.

(... a explicação da parte Cr+LF, não a getchar() parte de bloqueio)

Outras dicas

Isso porque getchar () é um bloqueando função.

Você deveria ler sobre funções de bloqueio, que basicamente faz o processo esperar para que algo aconteça.

A implementação disso espera O comportamento depende da função, mas geralmente é um loop que aguarda que algum evento aconteça.

Para o caso do getchar() Função, isso provavelmente é implementado como um loop que lê constantemente um arquivo (Stdin para este caso) e verifica o clima que o arquivo é modificado. Se o arquivo for modificado, o loop se comportará fazendo outra coisa.

Experimente isso:

#include <stdio.h>

int main(int argc, char *argv[])
{
    char ch;

    printf("I'm now going to block until you press something and then return... ");

    ch = getchar();

    if (ch >= 0)
       printf("\nYou pressed %c\n", ch);
    else
       printf("\nAliens have taken over standard input! Run!\n");

    return 0;
}

getchar() fará com que seu programa vá dormir até que um teclado (ou o que for anexado ao stdin) interrompida seja recebido. Isso significa que está bloqueando, nenhum código adicional será executado até getchar() retorna.

É muito, muito útil olhar para o valor de retorno de uma função para entendê -la.

Qualquer função pode bloquear, a menos que forneça algum mecanismo para evitar o bloqueio. Por exemplo, open() Permite a O_NONBLOCK Flag, que é útil para abrir dispositivos lentos para responder, como modems. Em suma, se obtiver entrada de um terminal ou precisar esperar para obter uma resposta do kernel ou de algum dispositivo, há uma chance muito boa de que ele possa bloquear.

getchar () bloqueia a execução do seu programa até que uma tecla seja pressionada. Portanto, não há erro se nenhuma tecla for pressionada, getchar () esperará que isso aconteça :)

Você pode aprender mais sobre como o getchar se comporta aqui:http://www.cppreference.com/wiki/c/io/getchar... isso deve responder sua pergunta :)

Eu acho que o que o confunde é que a tecla Enter é necessária para o programa continua. Por padrão, o terminal buffer todas as informações até que o ENTER seja pressionado, antes mesmo de enviá -las para o programa C.

Vejo Discussão sobre inserir o problema aqui

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top