Программа вылетает со strtok [C] - PullRequest
0 голосов
/ 26 апреля 2018

У меня возникли проблемы с использованием функции strtok(). В этом упражнении мой учитель попросил использовать его для токенизации одной строки, затем сохранить четные слова в списке, а затем распечатать все четные токены и их вхождения. Но программа вылетает после того, как я пишу строку ввода. Может кто-нибудь объяснить мне, в чем проблема?

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define Dim 100

struct node{
int occ;
char sbuffer[Dim];
struct node *next;
}; 

struct node *first = NULL;

void occorrenze();
void insert(char *tkn);

int main(){

char array[Dim];
char buff[Dim];
char* token;

printf("Insert string: ");
gets(array);

for(token=strtok(array, " ") ; token!=NULL ; token=strtok(NULL," ") ){

    if ((strlen(token)%2)==0){
        insert(token);
        }

}

occorrenze();

 }

 void insert(char *tkn) {
 struct node *new_node;
 new_node = (struct node*)malloc(sizeof(struct node));
 strcpy(new_node->sbuffer, tkn);
 new_node->occ = 1;
 new_node->next = first;
 first = new_node;
 }

 void occorrenze() {
 struct node *p;
 struct node *s;
 for(p = first; p != NULL; p = p->next){    
     for(s = p; s != NULL; s = s->next){
         if(strcmp(s->sbuffer, p->sbuffer) == 0){
         p->occ++;
         }
      }
 }
 printf("\n%s\n%d\n",p->sbuffer, p->occ);
 }

(Извините за мой плохой английский ^^)

1 Ответ

0 голосов
/ 26 апреля 2018

Проблема в вашем printf() в конце occorrenze()

printf("\n%s\n%d\n",p->sbuffer, p->occ);

На данный момент p равен NULL, потому что ваш for цикл завершен

for (p = first; p != NULL; p = p->next) {

Код для поиска совпадений в основном правильный, я бы просто немного его изменил (вам понадобится всего один цикл) и переместил бы его на insert(), чтобы вам не нужно было добавлять слово a во второй раз, если он уже есть в списке, occorenze() может просто просмотреть список и напечатать слова и их значение occ:

void insert(char *tkn) {
    struct node *new_node;
    new_node = (struct node*)malloc(sizeof(struct node));

    for (struct node *n = first; n != NULL; n = n->next) {
        if (strcmp(tkn, n->sbuffer) == 0) {
            n->occ++;
            return;
        }
    }

    strcpy(new_node->sbuffer, tkn);
    new_node->occ = 1;
    new_node->next = first;
    first = new_node;
}

void occorrenze() {
    for (struct node*n = first; n != NULL; n = n->next) {
        printf("%d %s\n", n->occ, n->sbuffer);
    }
}
...