Ho rivisto un'attimo il tuo codice perchè non funzionava bene soprattutto sull'ultima evidenza "la stringa iniziale è ...".
Per il concetto di lim-1 il carattere "\n" nella tua manipolazione delle stringhe non lo tocchi mai ossia resta sempre perchè conti la lunghezza della frase (senza "\n") esempio 13 e lo passi ad un vettore come (13-1) ossia un vettore che va da 0 a 12 (13 elementi) e manipoli quei dati.

Un po confuso èèèèèèèèèèèèèèèèèè



codice:
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#define MAXLINE 20

void ordina(char* line, int maxline);
int conteggio(char* line, int maxline);

int main()
{
   int diversi, n;
   char frase[MAXLINE];
   char copiafrase[MAXLINE];
   cout << "Inserisci la stringa" << endl;
   cin.getline(frase,sizeof(frase));
   n= strlen(frase);
   for (int k = 0; k <= n+1; k++)
   copiafrase[k] = frase[k];
   cout << "La stringa e' lunga " << n << " caratteri" << endl;
   diversi=conteggio(frase,n);
   cout << "La stringa e' formata da " << diversi << " caratteri diversi" << endl;
   cout << "La stringa iniziale e' " << copiafrase << endl;
   system("PAUSE");
   return 0;
}

void ordina(char stringa[], int lim)
{
 int E,F,MAX,j,scambio;

 E=lim-1;
 F=1;

 while (F==1)
      {
        F=0;
        MAX=E;

        for (j=0;j<=MAX-1;j++)
          {
             if (stringa[j] > stringa[j+1])
             {
              scambio=stringa[j];
              stringa[j]=stringa[j+1];
              stringa[j+1]=scambio;
              E=j;
              F=1;
             }
          }
     }
     }

int conteggio(char stringa[],int lim)
{
 char prec;
 int conta,j;
 conta=0;
 ordina (stringa, lim);
 prec=stringa[0];
for (j=0;j<=lim-1;j++)
     {
      if (prec!=stringa[j])
	     {
          ++conta;
	      prec=stringa[j];
		  }
          else
		 {
          prec=stringa[j];
	     }
      } 
      return conta;
 }