Ola silvioclima,
Bom, o que acontece é que quando você usa uma destas funções de entrada via teclado, o que o programa faz é salvar o que foi digitado num buffer de entrada, e depois grava o que estiver neste buffer na variável que você quiser.
Exemplo: scanf ("%d", &idade);
Quando você digitar "20", o programa grava esse "20" no buffer, e depois a variavel idade pega o que estiver dentro do buffer (Que nesse caso era o "20").
O principal problema com o scanf, é que ele deixa dentro do buffer o "ENTER" que você pressiona para confirmar o que acabou de digitar.
Assim, quando você digita a primeira idade, ele vai "consumir" o numero que voce digitou, mas vai ficar um ENTER gravado no buffer de entrada; Quando o laço volta pro "gets(nome)", o gets lê o ENTER que ficou alocado no buffer, e pula esse comando, deixando o nome vazio (O programa entende que você nao quis colocar nome nenhum, e simplesmente digitou ENTER... Porém esse ENTER você digitou antes)... Ai ele vai direto pro scanf("%d", &idade)...
Enfim, pra solucionar o problema, coloque antes do "gets(nome)" o seguinte comando:
fflush(stdin);
Isso fará com que antes do comando "gets" o programa limpe o buffer de entrada, e assim o gets não lerá mais o ENTER que foi pressionado antes.
Se a explicação ficou confusa, por favor me avise, ok?!
Abraços,
Thiago.