Ввод пустой строки с системным вызовом read вызывает ошибку сегментации - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь прочитать входные данные из STDIN, используя read(int fd, void *buf, size_t count); Как я должен обрабатывать случаи, когда вход EOF? Или пустая строка? В настоящее время я получаю ошибку сегментации

Вот фрагмент кода:

int rd;
char buf[100];
rd = read(0, buf, 99);
buf[strcspn(buffer, "\n")] = 0;

Спасибо

1 Ответ

0 голосов
/ 24 января 2019

Как и все другие строковые функции, 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)
}
...