Как и все другие строковые функции, strcspn
полагается на строку, заканчивающуюся нулем в начале.
Если на входе нет новой строки, то функция strcspn
выйдет за пределы из-за отсутствия терминатора.
Вам также необходимо обработать случай, когда read
возвращается с концом файла или ошибкой, о чем свидетельствует возвращение 0
или -1
(соответственно). Как указано в руководстве (которое вы действительно должны прочитать!).
Просто добавьте терминатор непосредственно после вызова read
в соответствующей позиции, но только если read
завершится успешно:
rd = read(STDIN_FILENO, buf, sizeof buf - 1); // sizeof buf relies on buf being an actual array and not a pointer
if (rd == -1)
{
// Error, handle it
}
else if (rd == 0)
{
// End of file, handle it
}
else
{
// Read something
buf[rd] = '\0'; // Terminate string
// Terminate a newline
buf[strcspn(buf, "\n")] = '\0'; // Truncate at newline (if any)
}