scanf("%[^\n]s",&s);
имеет много проблем:
Нет проверки возвращаемого значения.
Нет защиты от переполнения
Нет потребления '\n'
Нетприсвоение s
только '\n'
Нет необходимости s
в "%[^\n]s"
Неправильный тип &s
с форматом.
scanf("%[^\n]s",s);
имеет только одну меньшую проблему (последнюю).
Использование fgets(s, sizeof s, stdin)
if (fgets(s, sizeof s, stdin)) {
s[strcspn(s, "\n")] = 0; // Lop off potential ending \n
// Success
} else {
// failure
}
- Без проверкивозвращаемое значение
Без проверки возвращаемого значения успешность чтения неизвестна и состояние s
не определено.
- Нет защиты от переполнения
Что происходит при вводе 100-го символа?- «Очень плохо. Не хорошо. Не хорошо». Necron 99, Wizards 1977
'\n'
остается в stdin
, чтобы запутать следующее чтение.
- Нет назначения
s
только для '\n'
Если вход начинается с '\n'
, scanf () возвращает и s
без изменений.Он не назначен ""
.
- Нет необходимости в
"s"
in "%[^\n]s"
"s"
не является частью спецификатора "%[^\n]"
.Бросьте его.
- Неправильный тип
&s
с форматом.
%[...]
соответствует char *
, а не указателю на char[100]
, как &s
(UB).