In riferimento a questo, ho fatto questo programma dove le funzioni hanno una logica corretta (ho svolto l'esercizio prima senza allocazione dinamica e funzionava) e adesso avrò fatto qualche pasticcio con i puntatori.
L'errore sta nella funzione GenerareStringaOutput dove credo di aver sbagliato a utilizzare il doppio puntatore per scrivere gli elementi del vettore p_mstringa.
La cosa che non capisco è come fare a scrivere gli elementi del puntatore char *mstringa attraverso la funzione GenerareStringaOutput che ha in input il doppio puntatore char **p_mstringa ,necessario per dare in input alla sottofunzione AllocareMemoriaP_Mstringa il puntatore a puntatore.
/*Si consideri la sequenza “a, b, (a, c, g), b, e, (p,q ), a, (x, x), f”.
La sequenza di output sarà allora la seguente: a, b, (*), b, e, (*), a, (*), f.
*/
#include <stdio.h>
#include <stdlib.h>
#define DIM 50
#define PA '('
#define PC ')'
int VerificareCorrettezzaStringa(char *stringa);
void GenerareStringaOutput(char **p_mstringa, char *stringa);
void AllocareMemoriaP_Mstringa(int i, char **p_mstringa);
void StampaStringa(char *p_mstringa);
int main(void){
int i;
char *stringa = "a, b, (a, c, g), b, e, (p,q ), a, (x, x), f";
char *mstringa = NULL;
i = VerificareCorrettezzaStringa(stringa);
printf("i: %d\n",i);
if (i == 1){
GenerareStringaOutput(&mstringa, stringa);
}
StampaStringa(mstringa);
system("pause");
return 0;
}
int VerificareCorrettezzaStringa(char *stringa){
int j = 0;
int trovato = 1;
while(stringa[j] != '\0' && trovato == 1){
if (stringa[j] == PC){
trovato = -1;
}
if (stringa[j] == PA){
while(stringa[j] != PC && trovato == 1){
if (stringa[j + 1] == PA){
trovato = -1;
}
j++;
}
}
j++;
}
return trovato;
}
//considerare anche il caso in cui all'interno delle parentesi non vi è alcun numero
void GenerareStringaOutput(char **p_mstringa, char *stringa){
int i = 0;
int j = 0;
while(stringa[i] != '\0'){
AllocareMemoriaP_Mstringa(j + 1, p_mstringa);
*(*p_mstringa + j) = *(stringa + i);
if(*(stringa + i) == PA){
j++;
*(*p_mstringa + j) = '*';
while(*(stringa + i) != PC){
i++;
}
j++;
*(*p_mstringa + j) = PC;
}
i++;
j++;
}
*(p_mstringa + j) = '\0';
}
void AllocareMemoriaP_Mstringa(int j, char **p_mstringa){
*p_mstringa = (char *) realloc (*p_mstringa, j * sizeof(char));
return;
}
void StampaStringa(char *p_mstringa){
printf("%s\n",p_mstringa);
}