if ((c = getchar()) != '\n') {
wrt_t();
}
Если вы используете оператор if
, для каждой рекурсии будет выбираться только один символ. Если это не новая строка (\n
), она переходит на следующий самый глубокий уровень рекурсии, и на этом выбранном уровне символ еще не печатается.
Когда, наконец, достигается новая строка, указанная во вводе , порядок вводимых символов будет напечатан в обратном порядке, так как самый глубокий (последний) уровень рекурсии сначала печатает свой выбранный символ, и, таким образом, идет порядок до самого высокого уровня рекурсии.
каждый более высокий уровень рекурсии, чем просто напечатать символ, который был получен на этом уровне рекурсии, и вернуться на следующий самый высокий уровень рекурсии.
Результатом является ввод символов до тех пор, пока первая новая строка не будет найдена в обратном порядке заказ.
while ((c = getchar()) != '\n') {
wrt_t();
}
Когда вы используете while
l oop, поведение другое. После того, как новая строка будет наконец достигнута на самом глубоком уровне рекурсии, он напечатает последний символ ввода (символ, полученный на этом последнем уровне рекурсии), вернется на следующий самый высокий уровень рекурсии и выполнит итерацию соответствующего while
l oop пока он не найдет другой символ новой строки во входных данных, чтобы выйти из l oop и вернуться на следующий самый высокий уровень рекурсии.
Если вы не предоставляете столько новых строк, сколько уровней рекурсии во входных данных, всей рекурсии застрянет.
Например, для ввода 5 символов, таких как "hello"
, вам потребуется 6 завершающих символов новой строки, чтобы выйти из рекурсии:
hello\n\n\n\n\n\n
Обратите внимание, что в этом случае вывод был бы таким же неправильным. Он будет печатать только 6 новых строк, так как добавленные новые строки перезаписывают символы, сохраненные ранее в соответствующей переменной c
на каждом уровне рекурсии.
В вашем случае, если он получает только одну новую строку, он будет печатать только последний символ (на самом деле символ новой строки) ввода, который был извлечен на самом глубоком уровне рекурсии, и дождитесь ввода дополнительных данных.
Кроме того, если вы получили ошибку ввода и getchar()
вернули EOF
, вы получите бесконечное l oop на любом из уровней рекурсии.