scanf
читает символы из stdin
и сохраняет их в памяти, на которую указывает n
. Вы не инициализировали n
, чтобы указывать на что-либо, поэтому scanf
, вероятно, пытается сохранить ваш ввод в каком-то произвольном месте в памяти. Вам повезло, что он разбился, а не вел себя так, как будто работал правильно.
Возвращение строки из функции C более сложно, чем вы могли бы ожидать.
Существует (как минимум) три общих подхода:
Требуется, чтобы вызывающая сторона передавала указатель на (первый элемент) массива, в котором должна храниться строка, вместе с другим аргументом, сообщающим функции, насколько велик массив. Это может потребовать обработки ошибок, если массив недостаточно велик для хранения результата.
Объявите массив static
внутри функции и верните указатель на него. (Вы не можете вернуть указатель на нестатический локальный массив, так как массив перестает существовать, когда функция возвращается.) Проблемы: при множественных вызовах используется одно и то же пространство памяти (особенно проблематичное при наличии потоков) и выделенное размер фиксированный.
Выделите результат внутри функции, используя malloc()
. Это требует от вызывающего абонента free()
результата.
Рекомендуемое чтение: comp.lang.c FAQ . В частности, вопрос 7.5b - это почти прямой ответ на ваш вопрос (и он бы сэкономил мне немного времени, если бы я понял это раньше). (Обычно я не ссылаюсь на отдельные вопросы, потому что мне нравится побуждать людей к просмотру.)
РЕДАКТИРОВАТЬ: Кроме того, scanf
с неквалифицированным форматом "%s"
по своей сути небезопасны. Он будет пытаться сохранить сколько угодно символов, введенных в массив; нет способа избежать переполнения буфера (скажем, если ваша кошка сидит на клавиатуре). @Artefacto упомянул эту проблему в ссылке в комментарии.