-1

Вот пример из пособия от Брайана Кернигана.

#include <stdio.h>
#include <string.h>
int main(void)
{
 double nc;
 for (nc = 0; getchar() != EOF; ++nc);
 printf ("%.0f\n", nc);
}

А вот он же, но из cs50:

#include <cs50.h>
#include <stdio.h>

int main(void)

int counter = 0;
while (true)
{
printf("%i\n",  counter); 

counter++;
}

И я уже вконец запутался, как все-таки он должен выглядеть. Ведь ни работает ни тот, ни другой.

Harry
  • 221,325
  • 1
    Ну второй явно ничего не подсчитывает, потому что там просто бесконечный цикл. – Алексей Саровский Apr 25 '17 at 17:01
  • Ответ зависит от того что символом в вашем случае вы хотите рассматривать. Пример для Питона – jfs Apr 25 '17 at 17:44
  • В идеале - хотелось бы узнать как считать все символы, включая пробелы до тех пор ,пока не будет осуществлен переход на новую строку нажатием enter – Pavel Bobrov Apr 25 '17 at 17:53
  • @PavelBobrov я не об этом. Вы по ссылке перейдите и посмотрите примеры разницы между байтами, code units, Unicode code points, graphemes clusters (символы, воспринимаемые пользователем). К примеру, буква я это два байта на этой странице (utf-8 кодировка используется). От задачи зависит: хотите вы 2 вернуть (закодировано используя два байта), если на входе я или 1 (как один символ считать). – jfs Apr 25 '17 at 18:20
  • Что делает 2 код? –  Oct 06 '17 at 19:34

2 Answers2

0

Я бы сказал, что вот так:

#include <stdio.h>
int main()
{
    int nc;
    for(nc = 0; getchar() != EOF; ++nc);
    printf ("%d\n", nc);
}

Только не забудьте по окончанию ввода нажать Ctrl-Z (В Linux, насколько я помню, Ctrl-D, что ли...)

Второй код - просто бред какой-то...

Harry
  • 221,325
  • Можно упомянуть что это считает байты в стандартном вводе (wc -c). Ещё можно uintmax_t и PRIuMAX использовать. – jfs Apr 25 '17 at 17:37
  • Не сочтете ли Вы за труд привести так же while цикл для завершения программы? С синтаксисом этих циклов я уже знаком, а вот условие выхода никак сообразить не могу. – Pavel Bobrov Apr 25 '17 at 18:00
  • while(getchar() != EOF) ++nc; - вместо for, только nc обнулите предварительно. Вы это спрашивали? – Harry Apr 25 '17 at 18:14
  • не совсем. Этот тот же код, но записан с циклом while, вместо for. Я же хотел просто придумать выход из программы без сочетания клавиш ctrl+d. – Pavel Bobrov Apr 25 '17 at 21:05
  • Что-то вроде do... ...while (getchar() != 27) Который значит: делай это пока не будет введен 27 символ, который соответствует клавише enter. Но все оказалось не так просто. После nfrb[ bpvtytybq программа перестала реагировать даже на ctrl+d – Pavel Bobrov Apr 25 '17 at 21:39
  • Представленный вами цикл - выполняй, пока не введено нечто - т.е. как минимум подсчитает на 1 символ больше. Далее, getchar() не предусмотрен для отлова нажатий всяких клавиш типа Esc (с кодом 27) или Enter (с кодом 13). Для этого нужно использовать getch()... Но getch() не понимает признака конца файла, так как работает с клавиатурой, а не с потоком. – Harry Apr 26 '17 at 04:04
  • Послушайте, если вы хотите, чтоб вам помогли - сформулируйте ясно, что вы хотите. Я отвечал на вопрос, как должен выглядеть работающий код. Я ответил. Но, похоже, вас интересует вовсе не это. Так не заставляйте вытягивать из вас, что именно... – Harry Apr 26 '17 at 04:09
  • @Harry. Таки вот тот код, который я хотел получить.(см.выше). Подсчет символов завершается вводом нулевого символа , он же - конец строки, а значит = клавише enter – Pavel Bobrov Apr 26 '17 at 11:15
-1

Вот так это должно было выглядеть.

int main(void)
{
  string s = GetString();
  int n = 0;
  while (s[n] != '\0')
    {
       n++;
    }
  printf("%i\n", n);
}
  • GetString() из cs50.h читает строку (заканчивающуюся на '\n' -- символ новой строки) из ввода (возвращает C строку, заканчивающуюся на '\0', не включая '\n'). Это отличается от первого примера в вопросе, который всегда до конца (возможно многострочного) ввода читает (до EOF). C тем же успехом (вместо вашего кода), вы можете просто n = strlen(s) использовать. – jfs Apr 27 '17 at 13:33
  • Или так. Разницы никакой, как мне кажется. Проще, или короче код все ровно не стал. Однако для strlen нужно подключать еще одну библиотеку. – Pavel Bobrov Apr 27 '17 at 21:27