Не существует простого способа в соответствии со стандартом C
(C11
), однако, POSIX определяет необязательный символ присваивания-выделения m
как часть спецификатора преобразования, что облегчает работу программистаот ответственности за выделение памяти.
Однако при этом используется динамическое выделение памяти, и вам необходимо вызвать free()
для указателя позже.
Цитировать ссылку:
Спецификаторы преобразования %c
, %s
и %[
должны принимать необязательный символ присваивания-выделения 'm'
, который должен вызывать выделение буфера памяти для хранения преобразованной строки, включая завершающий нулевой символ.В таком случае аргумент, соответствующий спецификатору преобразования, должен быть ссылкой на переменную-указатель, которая получит указатель на выделенный буфер.Система должна выделить буфер, как если бы был вызван malloc()
.Приложение несет ответственность за освобождение памяти после использования.Если памяти недостаточно для выделения буфера, функция должна установить errno
в [ENOMEM]
, и в результате возникнет ошибка преобразования.Если функция возвращает EOF
, любая память, успешно выделенная для параметров с использованием символа присвоения-выделения 'm'
этим вызовом, должна быть освобождена до возврата функции.
Что-то вроде
#include <stdio.h>
#include <stdlib.h>
int main() {
char* str = NULL;
scanf("%ms", &str);
printf("%s\n", str);
free(str);
return 0;
}
сделает работу.