Стандарт POSIX.1-2008 определяет функцию getline , которая будет динамически (пере) распределять память, чтобы освободить место для строки произвольной длины.
Преимущество перед gets
заключается в том, что он неуязвим для переполнения фиксированного буфера, и преимущество над fgets
в возможности обрабатывать строки любой длины за счет потенциальной DoS, если длина линии равна больше свободного места в куче.
До поддержки POSIX 2008 Glibc также представлял это расширение GNU.
char *input(const char *prompt, size_t *len) {
char *line = NULL;
if (prompt) {
fputs(prompt, stdout);
fflush(stdout);
}
getline(&line, len, stdin);
return line;
}
Не забудьте free(line)
после того, как вы закончите с ним.
Для чтения в буфер фиксированного размера используйте fgets
или scanf("%*c")
или аналогичный; это позволяет вам указать максимальное количество символов для сканирования, чтобы предотвратить переполнение фиксированного буфера. (Нет причин использовать gets
, это небезопасно!)
char line[1024] = "";
scanf("%1023s", line); /* scan until whitespace or no more space */
scanf("%1023[^\n]", line); /* scan until newline or no more space */
fgets(line, 1024, stdin); /* scan including newline or no more space */