пока l oop для построения списка не заканчивается - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь выяснить, почему мой код не работает, но мне пока не удалось. Код должен проанализировать строку и создать список, содержащий все буквы алфавита 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));

все работает правильно.

Спасибо всем.

...