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;
}