Код OP подвергается хакерской атаке и может вызывать неопределенное поведение .
// What happens if the first character read is a null character?
fgets(input, length, stdin);
if (input[strlen(input) - 1] != '\n')
Когда fgets()
читает входные данные, входные данные нулевой символ не является специальным.Он читается и сохраняется как любой другой символ.
Если это патологический случай, input[0] == 0
и strlen(input) - 1
равны SIZE_MAX
.input[SIZE_MAX]
, безусловно, является доступом за пределы массива, поэтому неопределенное поведение .
Проверка, если fgets()
не прочитала всю строку, - установить последний символ буфера наненулевой и более поздний тест, если он становится 0.
assert(input && length > 1);
input[length - 1] = '\n';
// check `fgets()` return value
if (fgets(input, length, stdin) == NULL) {
return NULL;
}
if (input[length - 1] == '\0' && input[length - 2] != '\n') {
// more data to read.