Fallo de segmentación (núcleo volcado) leído desde stdin

Estoy tratando de contar el número de cada palabra en un archivo. El archivo puede ser estándar o un nombre de archivo proporcionado en la línea de comando (./ count -f). Hasta el momento, el programa proporciona los resultados correctos al leer un archivo desde la línea de comandos. Pero ocurre un error cuando intento leer desde stdin. El programa primero genera la salida correcta, luego da un fallo de segmentación (núcleo volcado). Aquí es parte de mi código.

    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.
    }
}

Función 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

}

Por favor, ayúdeme a averiguar por qué tengo un error de segmentación (núcleo volcado). El programa funciona en mi mac, pero no funciona en Linux.
Gracias por adelantado.