Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > В чем отличие подсчета символов во входном потоке


Автор: n199a 17.4.2013, 16:27
Не могу понять, чем отличаются эти 2 кода:

Код

/* подсчет строк, слов и символов во ВХОДНОМ потоке */
#include <stdio.h>

#define IN  1    
#define OUT 0 
main()
{
      int c, nl, nw, nc, state;
      
      state = OUT;
      nl = nw = nc = 0;
      while ((c = getchar()) != EOF) {
            ++nc;
            if (c == '\n')
               ++nl;
            if (c == ' ' || c == '\n' || c == '\t')
               state = OUT;
            else if (state == OUT) {
                 state = IN;
                 ++nw;
                 }
            }
            printf("%d %d %d\n", nl, nw, nc);
}


Где именно осуществляется подсчет? Как посмотреть, сколько "он" насчитал?

Код

/* подсчет символов во входном потоке */
main()
{
      long nc;
      
      nc = 0;
      while (getchar() != EOF)
            ++nc;
      printf("%ld\n", nc);
}


Первый код сохраняю как name1.c и компилирую, второй сохраняю как name2.c и компилирую.
Запускаю cmd, ввожу name1 (Enter), печатаю сколько угодно символов и жму Enter, появляется новая строчка и опять можно печатать, и так до бесконечности. Во втором случае с name2 все аналогично. Так чем они отличаются?

Автор: Arantir 17.4.2013, 17:59
Цитата(n199a @  17.4.2013,  15:27 Найти цитируемый пост)
и так до бесконечности

"Конец файла", он же EOF, на который вы проверяете вводимый символ, в Windows вводится по нажатию Ctrl+Z. Если вам надо завершать цикл по Enter (новая строка), то следует использовать EOL.

Оба варианта кода бесконечно (до нажатия Ctrl+Z) читают вводимые символы. Первый код, судя по всему, помимо общего количества символов, считает еще строки (по количеству переносов строк) и слова (по количеству пробелов/переносов/табуляций).

Добавлено @ 18:00
Цитата(n199a @  17.4.2013,  15:27 Найти цитируемый пост)
Где именно осуществляется подсчет?

Инкремент сразу после ввода символа. Функция getchar() читает один символ из входного потока.

Автор: n199a 17.4.2013, 18:52
[quote]
Цитата(n199a @  17.4.2013,  15:27 )
и так до бесконечности

"Конец файла", он же EOF, на который вы проверяете вводимый символ, в Windows вводится по нажатию Ctrl+Z. Если вам надо завершать цикл по Enter (новая строка), то следует использовать EOL.

Оба варианта кода бесконечно (до нажатия Ctrl+Z) читают вводимые символы. Первый код, судя по всему, помимо общего количества символов, считает еще строки (по количеству переносов строк) и слова (по количеству пробелов/переносов/табуляций).

Добавлено @ 18:00
Цитата(n199a @  17.4.2013,  15:27 )
Где именно осуществляется подсчет?

Инкремент сразу после ввода символа. Функция getchar() читает один символ из входного потока.
[quote]
Вот, то, что надо. Вместо EOF надо использовать EOL.  smile 
Кстати, от безысходности я начал тыкать все клавиши, чтобы хоть какая-нибудь табличка вылезла и она вылезла, когда я нажал F6 (аналог Ctrl+Z).

Автор: n199a 17.4.2013, 19:23
А почему тут когда я ставлю EOL, то не компилируется?
Код

      while (getchar() != EOF)

Код

/* подсчет символов во входном потоке */
#include <stdio.h>

main()
{
      long nc;
      
      nc = 0;
      while (getchar() != EOF)
            ++nc;
      printf("%ld\n", nc);
}


Вылазит ошибка:
Код

`EOL' undeclared (first use in this function)   (Each undeclared identifier is reported only once for each function it appears in.) 

Автор: Crafty 17.4.2013, 19:44
Цитата(n199a @  17.4.2013,  19:23 Найти цитируемый пост)
А почему тут когда я ставлю EOL, то не компилируется?

Что такое EOL?
Если end of line, то в С '\n' является концом строки.

Автор: n199a 17.4.2013, 19:51
Цитата(Crafty @  17.4.2013,  19:44 Найти цитируемый пост)
Что такое EOL?
Если end of line, то в С '\n' является концом строки.

Когда стоит EOF - то надо писать '\n' (перенос на новую строку) и окончание цикла while закончится по нажатию Ctrl+Z (Enter).
Если писать EOL - то не надо использовать '\n' (перенос на новую строку) и окончание цикла while закончится по нажатию Enter.
Я правильно понял?

Нет, не так.
Как будет выглядеть рабочий вариант с использованием EOL?

Код работает так:
1) Запускаю через cmd
2) Ввожу любые символы/знаки
3) Enter
4) Опять ввожу символы/знаки
.... 
И так продолжается, пока не нажмешь Ctrl+Z (потом Enter).

А как сделать так, чтобы вместо Ctrl+Z надо нажимать Enter, чтобы программа завершалась?

Автор: Arantir 17.4.2013, 19:59
n199a, EOF и EOL — это только аббревиатуры ("end of file", "end of line").
Нет символа "конец файла", поэтому для этого есть константа EOF. В то же время "конец строки" — это символ '\n'. 
Цикл закончится по нажатию enter, если вы напишите '\n' вместо EOF.

Добавлено через 1 минуту и 16 секунд
Для конца строки так же есть константа std::endl

Автор: n199a 17.4.2013, 20:03
Цитата(Arantir @  17.4.2013,  19:59 Найти цитируемый пост)
n199a, EOF и EOL — это только аббревиатуры ("end of file", "end of line").
Нет символа "конец файла", поэтому для этого есть константа EOF. В то же время "конец строки" — это символ '\n'. 
Цикл закончится по нажатию enter, если вы напишите '\n' вместо EOF.

Вот, то, что надо  smile 

Автор: Arantir 17.4.2013, 20:06
Цитата(Arantir @  17.4.2013,  18:59 Найти цитируемый пост)
Для конца строки так же есть константа std::endl 

Упс, сори, это не константа, а функция (не бить, я специализируюсь не на c++ =))

Автор: Crafty 17.4.2013, 20:07
Я думаю стоит почитать учебник какой-нибудь.

Автор: n199a 18.4.2013, 09:32
Цитата(Crafty @  17.4.2013,  20:07 Найти цитируемый пост)
Я думаю стоит почитать учебник какой-нибудь. 

Я читаю и по ходу дела возникают вопросы, которые я задаю сюда.
 smile 
Кстати, какой учебник посоветуете для начала? (Керниган,Ритчи - Программирование на C.2 издание.2009)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)