читать () стандартный ввод в с? - PullRequest
0 голосов
/ 08 марта 2012

У меня небольшой вопрос, связанный с командой read ().

Я действительно ржавый в C, и, к сожалению, мое текущее назначение заставляет меня программировать на C. Нам нужно прочитать stdin, используя read (), а не fgets и т. п.

Итак, у меня есть простой цикл while:

int n, i;
char buffer[257], *input;

while((n=read(fileno(stdin), buffer, 256)) > 0)
                {
                        buffer[n] ='\0';
                        if(buffer[n] = '\n') break;
                        write(input, buffer, strlen(buffer));
                }

Так что я не уверен, как остановить этот цикл при нажатии клавиши enter (end ofпоэтому у меня есть код прерывания, хотя я не знаю, правильно ли это сделано.

Цель, которую я пытаюсь достичь, - поместить входные данные из stdin в указатель 'input'

(я действительно плохо разбираюсь в указателях, так что терпите меня :))

Моя проблема в том, что я получаю ошибки сегментации, когда нажимаю клавишу ввода.Я хотел бы использовать fgets, потому что тогда все это будет решено с помощью простой

input = fgets(buffer, 256, stdin);

Черт возьми домашнее задание :( В любом случае, если кто-нибудь из вас может указать мне правильное направление, я был бы очень признателен. Спасибовы!

Ответы [ 2 ]

3 голосов
/ 08 марта 2012

Ты все делаешь неправильно. Во-первых, 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 элементов.

Надеюсь, я кое-что исправил для вас.

0 голосов
/ 08 марта 2012

Ваш input нигде не указан. Вам нужно либо выделить некоторую память (и освободить ее, когда вы закончите), либо указать, что она указывает на действительное хранилище.

Также = является назначением; == - это сравнение.

...