2012-03-07 5 views
0

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

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

Так что я просто в то время как цикл:

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 (конец строки), так вот почему у меня есть код прерывания, хотя Я не знаю, правильно ли это сделано.

Вся цель я пытаюсь сделать это поместить вход со стандартного ввода в указателе «вход»

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

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

input = fgets(buffer, 256, stdin); 

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

+3

'if (buffer [n] = '\ n') break;' Я думаю, что вы намеревались 'if (n && buffer [n-1] == '\ n') break;' (или, возможно, даже 'if (n == 1 && buffer [n-1] == '\ n') break; '. Также' write (input, buffer, strlen (buffer)); 'может быть заменено на' write (input, buffer, n); ' – wildplasser

+0

Ваш код похож на' x = 1, if (x == 0) {/*...*/} '. Вы можете определить проблему? –

ответ

2

Вы все исправите. Во-первых, write - системный вызов, который используется для записи в дескриптор открытого файла . Ваш input не похож на этот файл - дескриптор файла получается путем вызова syscall 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 утверждает, что она читает до кол байт из дескриптора файла. Это означает, что если ваш buffer объявлен как char[257], тогда вы должны позвонить read(stdin,buffer,257), а не 256. Вероятно, было бы более целесообразно просто объявить буфер как массив из 256 элементов.

Я надеюсь, что я выпрямил для вас кое-что.

+0

Ahh спасибо, это намного больше смысла! Я изменил цикл while, просто просто прочитав ввод «while» ((n = read (fileno (stdin), input, 256))> 0), и я выделил память для ввода *, поэтому теперь кажется, что все должно быть в рабочем состоянии Теперь! Всем спасибо! – Nick

0

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

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

+0

Добавляем к этому,' if (buffer [n] = = '\ n') break; 'никогда не может быть правдой, поскольку строка перед тем, как установить этот символ равным 0. Кроме того, write() записывает в дескриптор файла, а не указатель на char. – nos

+0

Итак, что мне делать для выделения некоторой памяти (извините, плохо с C). Все это отлично работало с fgets, поэтому я не уверен, что я должен делать с этим. Кроме того, поскольку запись строго для дескрипторов файлов, что я должен использовать для назначения того, что я читаю в * вход? Спасибо за помощь всем! – Nick

+0

Обязательно прочитайте документацию по функциям, которые вы используете. При проверке в сети мне нравится использовать [сайт POSIX.1-2008] (http://pubs.opengroup.org/onlinepubs/9699919799/). – pmg