Questo è un esercizio che è stato dato varie volte e ci sono un'infinità di soluzioni
in particolare usare due stringhe e "cancellare" mano a mano i caratteri della prima che ci sono nella seconda e viceversa implica "alterare" le due stringhe in ingresso, che potrebbe nno essere consentito, o semplicemente potrebbero essere const
nel tempo qualcuno ha consigliato anche eseguire un "sort" (funzione di libreria standard in C) delle due stringhe e poi di confrontare risultati
mi sembra inutilmente dispendioso e comunque altera i dai in input, non sempre è possibile farlo
anche creare due array di "lettere" e contarne le ripetizioni nella due stringhe e poi confrontarli, per vedere se ci sono differenze nelle ripetizioni delle lettere si può velocizzare e ridurre di occupazione di memoria
venendo da arduino per me la memoria è sempre critica
in passato avevo fatto una cosa simile a questo:
#include <stdio.h>
//#include <string.h>
#include <stdlib.h>
char input[] = "ciao, ";
char * output;
int anagramma(char * s1, char * s2)
{
if(s1 && s2)
{
// tutti e due i puntatori sono validi
int ana[256] = {0};
while(*s1)
{
ana[*s1]++;
s1++;
}
while(*s2)
{
ana[*s2]--;
s2++;
}
for(int i = 0; i < 256; i++)
{
if(ana[i])
{
return 0;
}
}
return 1;
}
else
{
// almeno uno dei due puntatori è invalido
return 0;
}
}
int main()
{
output=input;
printf("%s\n",input);
printf("%s\n",output);
if(anagramma(input, output))
{
printf("Le stringhe sono anagrammi\n");
}
else
{
printf("Le stringhe non sono anagrammi\n");
}
}
è C, non C++
ma quello che conta è la funzione che accetta due stringhe, non le cambia, e restituisce 1 se sono anagrammi, 0 se non lo sono
funziona con array di caratteri, puntatori a caratteri, array di caratteri inizializzati con "stringhe letterali", che stando al K&R non sono modificabili, puntatori a caratteri che puntano ad array di caratteri,
e ogni possibile combinazione