printf não imprimindo no console

Estou começando na linguagem C. Eu estou usando o eclipse (juno) como meu IDE e plug-in CDT instalado. Eu também descompactei o mingw64 (GCC Compiler). Eu escrevi um programa muito simples para ver se funciona. Este é o meu código:

#include  int main() { int age; printf("Hello, please enter your age:\n"); scanf("%d", &age); printf("Your age is %d", age); return 0; } 

O problema é que o buffer de saída é preenchido com o valor de string do primeiro printf mas não o envia para o console. Eu tenho que digitar um número, e só então o buffer despeja todos os dados no console, então eu vejo o console assim:

 1 Hello, please enter your age: Your age is 1 

em vez do que se espera que seja:

 Hello, please enter your age: 1 Your age is 1 

Agora, descobri que posso usar fflush(stdout) após o primeiro printf mas não acho que essa solução seja elegante e até mesmo necessária. Alguma idéia de como posso superar isso?

EDIT – porque eu estou aprendendo isso na minha universidade, eu não posso usar nada que não foi aprendido no curso, então eu posso usar printf e scanf

NEW EDIT – Acho que encontrei uma explicação para isso. Como eu disse, estou saindo para a visualização do console dentro do Eclipse. O estranho é que, se eu compilar e executar o programa a partir da linha de comando do Windows, recebo o resultado desejado. Portanto, acho que o eclipse está realmente gravando a saída em um arquivo e apresentando-a na janela do console. Como posso forçar o eclipse a abrir uma janela de linha de comando real em minhas configurações de execução?

Aparentemente, esse é um bug conhecido do Eclipse. Este bug é resolvido com a resolução do WONT-FIX. Eu não tenho nenhuma idéia do porquê. aqui está o link: Eclipse C Console Bug .

A saída está em buffer.

O stdout é armazenado em buffer por padrão, o que significa que ‘\ n’ deve limpar o buffer. Por que isso não está acontecendo no seu caso? Não sei. Precisa de mais informações sobre seu aplicativo / ambiente.

No entanto, você pode controlar o buffer com setvbuf ():

 setvbuf(stdout, NULL, _IOLBF, 0); 

Isso forçará o stdout a ser armazenado em buffer de linha.

 setvbuf(stdout, NULL, _IONBF, 0); 

Isso forçará o stdout a ser unbuffered, então você não precisará usar fflush (). Observe que isso afetará gravemente o desempenho do aplicativo se você tiver muitas impressões.

Tente definir isso antes de imprimir:

 setvbuf (stdout, NULL, _IONBF, 0); 

Você poderia tentar escrever para stderr, ao invés de stdout.

 fprintf(stderr, "Hello, please enter your age\n"); 

Você também deve dar uma olhada neste tópico relevante.

Como outros apontaram, a saída pode ser armazenada em buffer dentro de seu programa antes que um console ou shell tenha a chance de vê-lo.

Em sistemas unix-like, incluindo macs, o stdout tem buffer baseado em linha por padrão. Isso significa que seu programa esvazia seu buffer stdout assim que ele vê uma nova linha.

No entanto, no Windows, as novas linhas não são mais especiais e o buffer completo é usado. O Windows não suporta o buffer de linha; veja a página msdn no setvbuf .

Então, no Windows, uma boa abordagem é desligar completamente o buffer de stdout forma:

 setvbuf (stdout, NULL, _IONBF, 0); 
  1. Na pasta do seu projeto, crie um arquivo de texto “.gdbinit”. Ele conterá sua configuração do depurador gdb
  2. Edite “.gdbinit” e adicione a linha (sem as aspas): “set new-console on”
  3. Depois de construir o projeto, clique com o botão direito no projeto Debug> “Debug Configurations”, como mostrado abaixo Configuração de depuração

  4. Na guia “debugger”, assegure-se de que o “arquivo de comando do GDB” aponte para o seu arquivo “.gdbinit”. Senão, insira o caminho para o seu arquivo de configuração “.gdbinit”: Configuração do Gdb

  5. Clique em “Aplicar” e “Depurar”. Uma linha de comando nativa do DOS deve ser lançada como mostrado abaixo Console

Inclua c:\gygwin\bin na variável de ambiente PATH como uma variável de ambiente do sistema ou em seu projeto eclipse (properties-> run / debug-> edit)