Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Поведение getchar си  (Прочитано 1047 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн RaaaAAA

  • Автор темы
  • Новичок
  • *
  • Сообщений: 46
    • Просмотр профиля
Поведение getchar си
« : 06 Декабрь 2013, 21:55:30 »
/* подсчет вводимых символов; 1-я версия */
#include <stdio.h>
 
int main(void)
{
    long nc, c;
    nc = 0;
    while ((c=getchar()) != EOF)
    {
       putchar(c);
       ++nc;
       printf("%ld\n", nc);
    }
}
Почему для выхода из цыкла (если строка не пустая) нужно жать ДВА РАЗА ctrl-D ?

Получается что первое нажатие только запускает getchar и только если eof в пустой строке происходит выход из цикла. Если stdin не включает в себя eof тогда почему вообще происходит выход?  Где можно почитать ТД на все эти вещи?

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 2267
    • Просмотр профиля
Re: Поведение getchar си
« Ответ #1 : 06 Декабрь 2013, 22:14:26 »
Не знаю, у меня выходит по одному Ctrl+D.
Попробуйте заменить EOF на -1.
Также должно быть int, а не long, но у меня это на результат не влияет.
Пётр.

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5216
  • Все по палатам!
    • Просмотр профиля
Re: Поведение getchar си
« Ответ #2 : 06 Декабрь 2013, 23:31:26 »
RaaaAAA,
return 0; забыл
А 2 раза из-за буферизации ввода с консоли. ctrl-D воспринимается как конец строки и строка передается программе без последнего символа (это программа консоли делает)
Извините, я все еще учусь

Оффлайн RaaaAAA

  • Автор темы
  • Новичок
  • *
  • Сообщений: 46
    • Просмотр профиля
Re: Поведение getchar си
« Ответ #3 : 07 Декабрь 2013, 01:24:15 »
RaaaAAA,
return 0; забыл
А 2 раза из-за буферизации ввода с консоли. ctrl-D воспринимается как конец строки и строка передается программе без последнего символа (это программа консоли делает)
Просто как вариант на скорую руку намалевал без реторна 8). Тогда что происходит в строке где только EOF? Или EOF это явление отсутствия символов перед EOF? О_о Что написал. Почему мужчина сверху написал что у него все ок по этому поводу с первого раз говорит выходит?

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5216
  • Все по палатам!
    • Просмотр профиля
Re: Поведение getchar си
« Ответ #4 : 07 Декабрь 2013, 01:31:40 »
RaaaAAA,
Не знаю насчет сразу выходит -спроси его.
Эта проблема неоднократно обсуждалась в инете - погугли.
Извините, я все еще учусь

Оффлайн RaaaAAA

  • Автор темы
  • Новичок
  • *
  • Сообщений: 46
    • Просмотр профиля
Re: Поведение getchar си
« Ответ #5 : 07 Декабрь 2013, 02:01:06 »
 :-\
RaaaAAA,
Не знаю насчет сразу выходит -спроси его.
Эта проблема неоднократно обсуждалась в инете - погугли.
Ткните пожалуйста носом в сурс. Еще вчера перекопал. Только на Лоре нашел, что если EOF не в пустой строке то вот так вот и на этом разошлись.

Пользователь решил продолжить мысль 07 Декабрь 2013, 04:36:01:
Вот у буржуев есть на все ответы.

As others have already said, to handle Control-D, handle "end of file"s.

Control-D is a piece of communication between the user and the pseudo-file that you see as stdin. It does not mean specifically "end of file", but more generally "flush the input I typed so far". Flushing means that any read() call on stdin in your program returns with the length of the input typed since the last flush. If the line is nonempty, the input becomes available to your program although the user did not type "return" yet. If the line is empty, then read() returns with zero, and that is interpreted as "end of file".

So when using Control-D to end a program, it only works at the beginning of a line, or if you do it twice (first time to flush, second time for read() to return zero).
« Последнее редактирование: 07 Декабрь 2013, 04:36:01 от RaaaAAA »

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 2267
    • Просмотр профиля
Re: Поведение getchar си
« Ответ #6 : 07 Декабрь 2013, 11:24:20 »
У меня программа заканивалась по одному Ctrl+D, потому что я после ввода
строки или символа нажимал Enter и Ctlr+D вводилась в пустой строке.
Enter в данном случае необходим, чтобы ввод с терминала был послан
программе, а если надо, чтобы она сама управляла вводом,
в т.ч. обрабатывлала приём кодов от клавиатуры, то это уже гораздо сложнее.
Пётр.

Оффлайн RaaaAAA

  • Автор темы
  • Новичок
  • *
  • Сообщений: 46
    • Просмотр профиля
Re: Поведение getchar си
« Ответ #7 : 07 Декабрь 2013, 16:57:51 »
Братюня все уже разобрались в механике. Выше все уже написано на инглише. Жаль только то что в вопросах чуть сложней чем поссать на ладошку рунет оказывается бессилен.

 

Страница сгенерирована за 0.09 секунд. Запросов: 25.