sentence = realloc(sentence, i+2);
является распространенным анти-паттерном. Если realloc возвращает NULL, вы только что слили предложение. Вместо этого вам нужно написать
temp = realloc(sentence, i+2);
if(temp == NULL)
// out of memory - do something here
sentence = temp;
Чтобы сделать жизнь хуже, вы используете
- использование scanf, которое является частой причиной ошибок безопасности
- с использованием strcpy, что является частой причиной ошибок безопасности
- не проверяет результат любых ваших malloc для проверки, возвращает ли он NULL (если этого не произойдет, вы получите нарушение прав записи)
- Не добавлять +1 к strlen () перед вызовом malloc и, следовательно, получать 1-байтовое переполнение кучи от strcpy.
- И использование цикла while, где цикл for будет более подходящим.
Помимо этих шести ошибок безопасности, у вас все хорошо.