Sto provando a sotto eof e getchar ()

Aug 22 2020

Nel pezzo di codice riportato di seguito. Ogni volta che inserisco una serie di caratteri con ctrl + z alla fine, che dovrebbe contrassegnare EOF per getchar (). Sta stampando tutti i caratteri insieme a un altro carattere alla fine che ha un valore ASCII di 26. Non conosco il carattere per nome.

Mi aspetto che il programma finisca dove metto ctrl + z. Tuttavia, Ctrl + z funziona solo quando il flusso di input è vuoto.

Qualcuno può spiegare perché restituisce un personaggio così imbarazzante invece di terminare il programma?

#include<stdio.h>
#include<ctype.h>

int main(){

   int c;

   while((c = getchar()) != EOF)
       putchar(c);

   return 0;
}

Spiacente, non sono riuscito a caricare l'immagine, né ho modo di mostrare il carattere che ha quel valore di 26. I grafici delle tabelle ASCII dicono che 26 è / substitute /. Non so cosa significhi. Grazie.

Risposte

1 Gilles'SO-stopbeingevil' Aug 22 2020 at 16:11

Ctrl + Z è un carattere di controllo ASCII come Ctrl + A, Ctrl + B, Ctrl + @ e gli altri. Non lo è EOF. EOFè distinto da qualsiasi carattere: altrimenti, se getchar()restituiva quel valore, non si poteva sapere se era arrivato alla fine del file o se aveva letto quel carattere. Ctrl + Z ha il valore ASCII 26. Stai vedendo quello che hai digitato.

Sul tuo sistema operativo (Windows, presumibilmente), Ctrl + Z all'inizio di una riga indica al terminale che hai finito di digitare. (Più precisamente, penso che il codice sia nelle funzioni di libreria che leggono dal terminale, e non dal terminale stesso. Ma potrei sbagliarmi sui dettagli dato che non sono un esperto di Windows.) Funziona solo all'inizio di una riga perché è così che funziona il codice della libreria che legge dal terminale. Quando si digita Ctrl + Z all'inizio di una riga, viene visualizzata getchar()una condizione di fine file e viene restituito EOF.

Quando digiti Ctrl + Z non all'inizio di una riga, viene trattato come un carattere normale. Windows lo stampa come uno "strano glifo" che utilizza per indicare un carattere non stampabile.

Il significato ufficiale della maggior parte dei caratteri ASCII è stato dimenticato molto tempo fa. C'è un carattere di controllo ASCII che significava "fine del file", o più precisamente " fine della trasmissione ", che è Ctrl + D, e sopravvive nella famiglia del sistema operativo Unix per significare "fine dell'input" quando inserito in l'inizio di una riga su un terminale, proprio come Ctrl + Z su Windows. L' associazione di Ctrl + Z con end-of-file su Windows deriva da una diversa linea storica di sistemi operativi, per lo più da DEC, da cui si sono ispirati DOS e Windows di Microsoft.

Non esattamente la stessa domanda della tua, ma consiglio questa risposta che dovrebbe aiutarti a chiarire la tua confusione EOF.