A maior questão desse problema é entender que não se pode fazer qualquer tipo de trim(), strip() e outros tipos de manipulação de entrada que ignorem espaços antes e após a linha a ser lida. Em C, usei a função gets() para entrada por esse motivo também. Após lidar com a entrada problemática, outro detalhe é que só muda o estado de maiúscula para minúscula quando encontramos uma letra, espaços devem ser ignorados neste tratamento.
#include<string.h>#include<stdio.h>#include<ctype.h>intmain(){int n, maiuscula;char sentenca[51];while(gets(sentenca)!=NULL){ maiuscula =1; n =strlen(sentenca);for(int i =0; i < n; ++i){if(!isalpha(sentenca[i])) continue;if(maiuscula) sentenca[i] =toupper(sentenca[i]);else sentenca[i] =tolower(sentenca[i]); maiuscula =1- maiuscula; }printf("%s\n", sentenca); }return0;}