Estou tentando entender eof e getchar ()
No trecho de código fornecido abaixo. Sempre que estou inserindo um conjunto de caracteres com um ctrl + z no final, que deve marcar EOF para getchar (). Ele está imprimindo todos os caracteres junto com outro caractere no final que tem um valor ASCII de 26. Não sei o caractere pelo nome.
Espero que o programa termine onde quer que eu coloque um ctrl + z. No entanto, Ctrl + z só funciona quando o fluxo de entrada está vazio.
Alguém pode explicar por que ele está retornando um caractere tão estranho em vez de encerrar o programa?
#include<stdio.h>
#include<ctype.h>
int main(){
int c;
while((c = getchar()) != EOF)
putchar(c);
return 0;
}
Desculpe, não consegui fazer o upload da imagem, nem tenho nenhuma maneira de mostrar o caractere que tem aquele valor de 26. Os gráficos da tabela ASCII dizem que 26 é / substituto /. Não sei o que isso significa. Obrigado.
Respostas
Ctrl + Z é um caractere de controle ASCII como Ctrl + A, Ctrl + B, Ctrl + @ e os outros. Não é EOF. EOFé distinto de qualquer caractere: caso contrário, se getchar()retornasse esse valor, você não saberia se chegou ao fim do arquivo ou se leu aquele caractere. Ctrl + Z tem o valor ASCII 26. Você está vendo o que digitou.
Em seu sistema operacional (Windows, provavelmente), Ctrl + Z no início de uma linha é uma indicação para o terminal de que você terminou de digitar. (Mais precisamente, acho que o código está nas funções da biblioteca que lêem do terminal, e não do terminal em si. Mas posso estar errado nos detalhes, pois não sou um especialista em Windows.) Funciona apenas no início de uma linha porque é assim que funciona o código da biblioteca que lê no terminal. Quando você digita Ctrl + Z no início de uma linha, getchar()vê uma condição de fim de arquivo e retorna EOF.
Quando você digita Ctrl + Z não no início de uma linha, é tratado como um caractere comum. O Windows o imprime como um “glifo estranho” que usa para indicar um caractere não imprimível.
O significado oficial da maioria dos caracteres ASCII foi esquecido há muito tempo. Há um caractere de controle ASCII que costumava significar "fim do arquivo", ou mais precisamente " fim da transmissão ", que é Ctrl + D, e sobrevive na família do sistema operacional Unix para significar "fim da entrada" quando inserido em o início de uma linha em um terminal, bem como Ctrl + Z no Windows. A associação de Ctrl + Z com end-of-file no Windows vem de uma linha histórica diferente de sistemas operacionais, principalmente do DEC, que o DOS e o Windows da Microsoft se inspiraram.
Não é exatamente a mesma pergunta que a sua, mas recomendo esta resposta, que deve ajudar a esclarecer sua confusão sobre EOF.