Ты все делаешь неправильно. Во-первых, write
- это системный вызов, который используется для записи в дескриптор открытого файла . Ваш input
совсем не похож на этот файл - дескриптор файла получается путем вызова сначала системного вызова open
или обращения к одному из всегда открытых файлов, например, stdin
, stdout
или stderr
. Не говоря уже о том, что файловый дескриптор является int
в Linux.
Кроме того, вы должны помнить, что предположение о том, что вы вводите stdin
, заканчивающийся символом новой строки, не всегда должно быть правильным. Ваша программа может получать некоторый контент на стандартный ввод, который не содержит никаких новых строк, например содержимое какого-либо файла (перенаправленного на stdin
), или ввод с клавиатуры может просто заканчиваться Ctrl-D
(EOF) вместо клавиша «возврат».
Вдобавок ко всему, неинициализированный указатель не ссылается на допустимую память . Объявление char *input
не дает вам никакого права на запись / чтение памяти, на которую ссылается input
, если только вы не выделите некоторую память, на которую этот указатель будет указывать первым.
Копирование строк в C достигается с помощью функций, объявленных в <string.h>
. Они работают на C-струнах, например последовательности символов, оканчивающиеся на \0
. В этом случае read()
не завершает свой вывод на \0
, и в этом случае вы захотите использовать функцию memcpy
. Почему бы вам просто не попробовать прочитать прямо в input
? Сначала нет смысла читать в buffer
, просто позже скопировать данные в другой кусок памяти.
Кроме того, спецификация read
гласит, что она читает от до count байтов из дескриптора файла. Это означает, что если ваш buffer
объявлен как char[257]
, то вы должны вызывать read(stdin,buffer,257)
, а не 256. Возможно, было бы более подходящим просто объявить буфер как массив из 256 элементов.
Надеюсь, я кое-что исправил для вас.