Salve ragazzi ho scritto un piccolo programma in c che deve leggere un intero N, leggere N stringhe e stampare in ordine di input prima le palindrome e dopo le restanti. non mi da errori a tempo di compilazione e al momento dell esecuzione mi da diversi risultati:
1) inanzitutto quando io ho inserito un intero mi stampa due volte la stessa cosa, così:"inserire una stringa...inserire una stringa", solo per la prima stringa che andrò ad inserire però! boooo;
2)se inserisco solo stringhe palindrome il programma funziona correttamente
3)se però come stringa inserisco "itopinonavevanonipoti " c'è l'errore segmentation fault(core dump);
4)se inserisco una stringa non palindroma, il programma si blocca immediatamente con l errore segmentation fault(core dump)
ho usato il debugger e dice che l'errore sta nella funzione AddPali, nella riga in cui nel while faccio "curr=curr->next" (solo nel case 3) però), sennò l'errore è nella funzione AddNorm quando faccio "prec->succ=newNorm".
qualcuno mi spiega cosa cè che non va?? Grazie.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char s[41];
struct pali *next;
}pali;
typedef struct{
char s[41];
struct norm *succ;
}norm;
typedef struct pali* listaP;
typedef struct norm* listaN;
void StampaListaN(listaN);
void StampaListaP(listaP);
int palindroma(char*);
pali* creaPali(char*);
norm* creaNorm(char*);
listaP AddPali(listaP, char*);
listaN AddNorm(listaN, char*);
int main()
{
printf("inserire intero...");
int n=0;
scanf("%d", &n);
listaP P;
listaN N;
for(int i=0;i<n;i++){
char str[41];
printf("inserire stringa...");
fgets(str,41,stdin);
if(palindroma(str)==0){
AddPali(P,str);
}else{
AddNorm(N,str);
}
}
StampaListaN(N);
StampaListaP(P);
return 0;
}
int palindroma(char *s1){
int l=strlen(s1);
char *s2=malloc(sizeof(char *)*l);
strcpy(s2,s1);
int j=l-2;
int i=0;
while(s1[i]!='\0'&&j>=0){
if(s1[i]!=s2[j]) { //usare funziona compare string
return 1;
}
j--;
i++;
}
return 0;
}
pali * creaPali(char * s1){
pali *ok=malloc(sizeof(pali *));
for(int i=0;s1[i]!='\0';i++){
ok->s[i]=s1[i];
}
ok->next=NULL;
return ok;
}
norm * creaNorm(char * s1){
norm *ok=malloc(sizeof(pali *));
for(int i=0;s1[i]!='\0';i++){
ok->s[i]=s1[i];
}
ok->succ=NULL;
return ok;
}
listaP AddPali(listaP lista, char *str){
pali *newPali, *prec, *curr;
curr=lista;
while(curr!=NULL){
prec=curr;
if(curr){
curr=curr->next;
}
}
newPali=creaPali(str);
prec->next=newPali;
return lista;
}
listaN AddNorm(listaN lista, char *str){
norm * curr, *prec, *newNorm;
curr=lista;
while(curr!=NULL){
prec=curr;
if(curr) curr=curr->succ;
}
newNorm=creaNorm(str);
prec->succ=newNorm;
return lista;
}
void StampaListaP(listaP list){
pali *p=list;
while(p!=NULL){
printf("%s", p->s);
p=p->next;
}
}
void StampaListaN(listaN list){
norm *p=list;
while(p!=NULL){
printf("%s", p->s);
p=p->succ;
}
}