Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Переносимость функции, Упражнение из учебника Кернигана и Ричи 
V
    Опции темы
Walker
Дата 19.6.2007, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 23.10.2006

Репутация: 1
Всего: 16



Доброго времени суток!
Помогите, пожалуйста, разобраться с задачей 4-6.

Условие.
--------
Функции GETCH и UNGETCH не обеспечивают обработку возвращенного символа EOF переносимым образом. Решите, каким свойством должны обладать эти функции, если возвращается EOF, и реализуйте ваши выводы.

Функция UNGETCH помещает возвращаемые назад символы в совместно используемый буфер, являющийся символьным массивом.
Функция GETCH читает из этого буфера, если в нем что-либо имеется; если же буфер пуст, она обращается к GETCHAR. При этом также нужна индексирующая переменная, которая будет фиксировать позицию текущего символа в буфере.

Код

#DEFINE BUFSIZE 100
char buf[BUFSIZE]; /* buffer for ungetch */
int bufp = 0; /* next free position in buf */

getch() /* get a (possibly pushed back) character */
{
   return((bufp > 0) ? buf[--bufp] : getchar());
}

ungetch(c) /* push character back on input */
int c;
{
   if (bufp > BUFSIZE)
      printf("ungetch: too many characters\n");
   else
      buf [bufp++] = c;
}


 smile 

Это сообщение отредактировал(а) Guedda - 19.6.2007, 08:51


--------------------
"От вчерашних побед остаётся усталость, если завтрашний день не сулит ничего..."
PM MAIL   Вверх
GIK
Дата 19.6.2007, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 4
Всего: 14



 
Цитата

Решите, каким свойством должны обладать эти функции, если возвращается EOF, и реализуйте ваши выводы.

Собственно ты решил уже один способ, с помощью которого можно достать символ при случае если массив пустой   smile В чем проблема? 

 


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Walker
Дата 20.6.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 23.10.2006

Репутация: 1
Всего: 16



Эти функции были приведены в учебнике. К ним и следовало вот такое задание. Проблема в том, что я его никак не могу понять.  smile 
По сути, эти функции реализуют откат при чтении текста по символам. Получается, если мы натыкаемся на EOF, то обработать его корректно можем не всегда. Так, что ли? А что у нас может не получиться? Записать его в массив? Считать оттуда? Насколько мне известно, EOF может быть где-то -1, где-то 0... Если у программы, которая использует GETCH и UNGETCH произойдёт останов, то это скорее её проблемы, а не этих функций... А если я не могу понять, в чём загвоздка, то и решения никакого предложить не могу.  smile 
В общем,  smile  smile  smile 



--------------------
"От вчерашних побед остаётся усталость, если завтрашний день не сулит ничего..."
PM MAIL   Вверх
Walker
Дата 21.6.2007, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 23.10.2006

Репутация: 1
Всего: 16



Всем Спасибо! Задача, кажется, решена.  smile  smile  smile 
До сих пор авторы учебника делали акцент на типах данных.
Думаю,вся соль заключается в строке
Код

char buf[BUFSIZE]; /* BUFFER FOR UNGETCH */

Дело в том, что EOF не является действительным символом и, следовательно, не может храниться в массиве типа char. Судя по содержанию предыдущих упражнений, авторы могли иметь в виду, что в этом случае вместо
Код

char buf[BUFSIZE];

следует использовать
Код

int buf[BUFSIZE];

P.S. Тему можно закрывать.



--------------------
"От вчерашних побед остаётся усталость, если завтрашний день не сулит ничего..."
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.2143 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.