Я пытаюсь выяснить, почему мой код не работает, но мне пока не удалось. Код должен проанализировать строку и создать список, содержащий все буквы алфавита engli sh (содержащиеся в alf), содержащиеся в этой строке (* s) и сколько раз:
` char c, *s, alf[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
Затем строка извлекается из файла, и у меня нет проблем, пока мне не удалось ее правильно распечатать в приглашении, так что это работает. В любом случае вот что я сделал (переменные int и num будут использованы позже):
FILE *f=fopen("prova.txt","r");
int d,l=0,num;
while(feof(f)==0){
l++;
fscanf(f,"%c",&c);
}
s=malloc(sizeof(l*sizeof(char)));
rewind(f);
l=0;
while(feof(f)==0){
fscanf(f,"%c",s+l);
l++;
}
//"stringa acquisita" stands for "acquired string"
printf("\nstringa acquisita:%s",s);
И строка выводится правильно, за исключением того факта, что она получает на один символ больше, чем должна. Любые советы в этом направлении также приветствуются. Итак, я добрался до составления списка. Вот что я сделал:
typedef struct Nodo{char car; int rip; struct Nodo* next;} Nodo;
typedef Nodo* lista;
lista head = NULL, el, temp;
for(l=0;l<26;l++){
num=0;
for(d=0;d<strlen(s);d++){
if(s[d]==alf[l]){
num++;
}
}
if(num!=0){
el = malloc(sizeof(Nodo));
if(el==NULL){
perror("error malloc\n");
exit(1);
}
el->car=alf[l];
el->rip=num;
if(head==NULL){
head=el;
el->next=NULL;
//this printf doesn't print anything on the prompt
printf("\n%c\n%d", head->car,head->rip);
}
else{
temp=head;
while(temp->next!=NULL){
temp=temp->next;
}
temp->next=el;
el->next=NULL;
}
}
//this printf prints only one time
printf("CHECKIT\n");
}
И вот мой код вылетает. Как я указал в комментариях, я добавил два printf, чтобы увидеть, что происходит. Первый не дает ничего напечатанного в приглашении, о втором я получаю распечатанный «CHECKIT», а затем все вылетает. Кто-нибудь может сказать мне, что мне здесь не хватает? Большое спасибо.
/ РЕДАКТИРОВАТЬ / Был на один размер больше, чем следовало бы: `
s=malloc(sizeof(l*sizeof(char)));` `
Исправлено это с помощью
s=malloc(l*sizeof(char));
все работает правильно.
Спасибо всем.