Ваш код зацикливается, пока не прочитает одно слово, а затем завершится. Так что, если вы дадите ему несколько слов, он прочитает первое и завершится, а если вы дадите ему пустой ввод, он зациклится навсегда. В любом случае, он будет печатать только случайный мусор из неинициализированной памяти. Это, видимо, не то, что вы хотите, но что вы хотите? Если вы просто хотите прочитать и напечатать первое слово (если оно существует), используйте if:
if (scanf("%15s", word) == 1)
printf("%s\n", word);
Если вы хотите зациклить, пока можете прочитать слово, используйте while:
while (scanf("%15s", word) == 1)
printf("%s\n", word);
Также, как уже отмечали другие, вам нужно дать массиву слов размер, достаточно большой для вашего scanf:
char word[16];
Другие предложили тестировать EOF вместо проверки того, сколько элементов соответствует scanf. Это хорошо для этого случая, когда scanf не может не соответствовать, если нет EOF, но не так хорош в других случаях (например, при попытке чтения целых чисел), где scanf может ничего не совпадать, не достигнув EOF (если input isn t число) и вернуть 0.
редактировать
Похоже, вы изменили свой вопрос, чтобы он соответствовал моему коду, который прекрасно работает, когда я его запускаю - циклически читает слова до достижения EOF, а затем завершает работу. Так что с вашим кодом происходит что-то еще, возможно, связанное с тем, как вы вводите его, как предложено Дэвидом