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>
int main(){
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);
}
return 0;
}