Проблема с подсчетом верхних и нижних букв в C - PullRequest
2 голосов
/ 29 мая 2020

Я написал программу, которая должна считать верхние и нижние буквы и другие знаки, но она считает что угодно, но только когда я нажимаю Enter, а затем ^ C (EOF). Не знаю, как перепрыгнуть, надеюсь, кто-нибудь мне чем-нибудь поможет <3 </p>

#include <stdio.h>
#include <ctype.h>

int main()
{
  char ch;
  int uppers = 0, lowers = 0, others = 0;


  while((ch = getchar()) != EOF)
  {
    if(islower(ch))
      lowers++;

    else if(isupper(ch))
      uppers++;

    else
      others++;
  }

  printf("\n\nUpper letters - %d  Lower letters - %d   Others- %d", uppers, lowers, others);


  return 0;
}

Ответы [ 2 ]

5 голосов
/ 29 мая 2020

Ctrl + C отправляет SIGINT, который обычно просто завершает ваше приложение.

Вам нужно Ctrl + D , который запускает EOF.

EDIT: Обратите внимание, что в оболочке по умолчанию Windows 'вам может потребоваться Вместо этого введите , Ctrl + Z , Введите (или F6 ) (хотя Ctrl + Z делает что-то совсем другое в оболочках Linux, отправляя SIGSTOP). См. этот вопрос .

Вы также можете сравнить с 0xD вместо EOF, чтобы поймать Введите , или, возможно, используйте 0x1B, который будет поймать Es c. Таким образом вы избегаете странностей, связанных с запуском конца ввода на разных платформах (если вы не хотите обрабатывать поток ввода).

Также обратите внимание на этот комментарий выше а также этот ответ , который содержит важную дополнительную информацию, которую мне не хватало!

1 голос
/ 29 мая 2020

CherryDt уже предоставил соответствующий ответ.


Но просто добавим к этому, EOF - это не символ , а конечное условие . Это может зависеть от ОС. Вы не можете полагаться на то, что он будет работать одинаково в любой среде. Я предлагаю использовать любой символ как условие для завершения l oop, а не условие, зависящее от среды.

ПРИМЕЧАНИЕ : решение сработало для завершения программы с ключами, сработало для меня Windows, только когда я включил fflush(stdin); после getchar(). Вероятно, getchar() принимает введенные вами данные и оставляет символ новой строки \n во входном потоке, который вызывал проблему, когда я пытался завершить работу, используя ctrl + D или ctrl + Z или F6 .

Но как только вы включите fflush(stdin), это решит проблему, и теперь программа успешно завершается, когда я использую F6 на Windows. Вы также можете попробовать использовать вышеупомянутые ключи, если это не работает для вас.

Надеюсь, это поможет некоторым Windows пользователям, если приведенный выше ответ не сработал для них.

...