Domanda

Sono confuso sul ruolo di getchar() nel codice seguente. Voglio dire, so che mi aiuta a vedere la finestra di output che sarà chiuso solo quando si preme il Invio chiave.

Quindi getchar() è fondamentalmente mi aspetta a premere Invio e quindi legge un singolo carattere.

Che cosa è che singolo carattere di questa funzione sta leggendo? Non ho premere un tasto qualsiasi sulla tastiera per poter leggere.

Ora, quando non è la lettura di nulla, perché non dà un errore che dice "hey, tu non hai inserito nulla per me leggere"?

#include <stdio.h>

int main()
{
    printf( "blah \n" );
    getchar();
    return 0;
}
È stato utile?

Soluzione

La funzione getchar() semplicemente aspettare finché non riceve un carattere, tenendo il programma fino a quando lo fa.

Un personaggio viene inviato quando si preme il tasto Invio; in un sistema operativo di Windows, invierà un ritorno a capo (CR) e un line-feed (LF).

questo CodingHorror messaggio per un ben messo spiegazione.

(... la spiegazione della parte CR + LF, non la parte di bloccaggio getchar())

Altri suggerimenti

Questo perché getchar () è un blocco la funzione.

Si dovrebbe leggere su funzioni di blocco , che in pratica rendono il processo di aspettare che qualcosa accada.

L'attuazione di questa in attesa il comportamento dipende dalla funzione, ma di solito si tratta di un ciclo che attende qualche evento accada.

Per il caso della funzione getchar(), questo probabilmente è implementato come un ciclo che legge costantemente un file (stdin per questo caso) e controlli meteo il file viene modificato. Se il file viene modificato, il ciclo si comporta facendo qualcos'altro.

Prova questo:

#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à sì che il vostro programma di andare a dormire fino a quando una tastiera (o tutto ciò che è collegato al stdin) interruzione è ricevuto. Ciò significa che è il blocco, nessun codice aggiuntivo verrà eseguito fino al ritorno di getchar().

E 'molto, molto utile per guardare il valore di ritorno di una funzione al fine di comprenderla.

Ogni funzione può bloccare, a meno che non fornisce un meccanismo per evitare il blocco. Ad esempio, open() permette un flag O_NONBLOCK che è utile per l'apertura lenta a rispondere dispositivi come modem. In breve, se si ottiene l'input da un terminale o deve attendere per avere una risposta dal kernel o qualche dispositivo, c'è una buona possibilità che potrebbe bloccare.

è premuto l'esecuzione di getchar () blocca il programma fino a quando un tasto. Quindi, non c'è nessun errore se non si preme alcun tasto, getchar () attenderà che accada:)

Si può imparare di più su come si comporta getchar qui: http://www.cppreference.com/wiki/c/io/getchar ... questo dovrebbe rispondere alla tua domanda:)

Credo che ciò che si confonde è che il tasto Invio è necessaria befor il programma continua. Per impostazione predefinita, il terminale di buffer tutte le informazioni fino a quando viene premuto Invio, prima ancora di inviarlo al programma C.

di Enter problema qui

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top