Ошибка сегментации (ядро сброшено), чтение из стандартного ввода

Я пытаюсь посчитать количество каждого слова в файле. Файл может быть либо stdin, либо именем файла, указанным в командной строке (./ count -f). Пока программа выдает правильные результаты при чтении файла из командной строки. Но ошибка происходит, когда я пытаюсь читать с стандартного ввода. Программа сначала выдает правильное значение, затем выдает ошибку сегментации (ядро сброшено). Вот часть моего кода.

    FILE * fp;
int size = 20000;
char sentence[2000]; // the sentence from stdin
if ( argc != 3 ) 
{
    fgets(sentence,sizeof(sentence),stdin); // read from stdin
    fflush(stdin);
    // I think the initialization of word is incorrect, but i do know why it is incorrect
    char *word = strtok (sentence," !\"#$%&'()*+,./:;<=>?@[\\]^_`{|}~\n\t");
    while (word != NULL)
    {
        get_word(word); // get each word
        word = strtok (NULL, " !\"#$%&'()*+,./:;<=>?@[\\]^_`{|}~\n\t");
    }
}
else
{
    fp = fopen( argv[2], "r" );
    if ( fp == 0 )
    {
        printf( "Could not open file\n" );
    }

           char word[1000];
    while (readFile(fp, word, size)) {  // let the program read the file
        get_word(word); // get each word. Works well.
    }
}

функция get_word:

void get_word(char *word){
node *ptr = NULL;
node *last = NULL;

if(first == NULL){
    first = add_to_list(word); // add to linked list
    return;
}

ptr = first;
while(ptr != NULL){
    if(strcmp(word, ptr->str) == 0){
        ++ptr->freq;
        return;
    }
    last = ptr;            
    ptr = ptr->next;  
}
last->next = add_to_list(word); // add to linked list

}

Пожалуйста, помогите мне понять, почему я получаю ошибку сегментации (ядро сброшено). Программа работает на моем Mac, но не работает на Linux.
Заранее спасибо.

Ответы на вопрос(2)

Ваш ответ на вопрос