Ожидание нажатия Enter - C (СИ)

  1. Написал программкуC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <stdio.h>   main() {     int c;     long tab,prob,strend;     tab = 0;     prob = 0;     strend = 0;     while ((c=getchar())!='1') { /* В идеале не '1', а EOF, но как EOF ввести с клавы я не знаю */         if (c == ' ') ++prob;         if (c == '\n') ++strend;         if (c == '\t') ++tab;     }     printf("probeli: %d\nokonchania strok: %d\ntabuliacii: %d\n",prob,strend,tab); }Но она как только я введу 1 завершается, и я ничего не успеваю прочитать. Как сделать, что-бы она ждала, пока я нажму Enter?


textual

Код:

#include <stdio.h>
 
main()
{
    char p;
    int c;
    long tab,prob,strend;
    tab = 0;
    prob = 0;
    strend = 0;
    while ((c=getchar())!='1') {
        if (c == ' ') ++prob;
        if (c == '\n') ++strend;
        if (c == '\t') ++tab;
    }
    printf("probeli: %d\nokonchania strok: %d\ntabuliacii: %d\n",prob,strend,tab);
    scanf(p);
}


Похожие ответы
  1. Здравствуйте, пишу игру на си - Hit the mole. Смысл в том, что каждые 5 секунд, например, нужно генерировать число случайное, выводить на экран и ожидать ввод этого числа с клавиатуры. Как сделать ожидание нажатия клавиши в течение 5 секунд?

  1. C1 2 3 4 5 6 7 8 9 10 11 12 13 #include #include "console.h"   int main(int argc, char **args) {     int ch;     while((ch = getch()) != 'q'){         putchar(ch);         if(ch == 'c'){             clear();         }     } }После нажатия 'c' экран очищается, но остаётся символ 'c'. Почему?

  1. Программа постоянно запрашивает число. Если например введено число 3, то нужно чтоб программно было нажаты кнопочки Ctrl+Ald+Delete. Если введено число 8 то нужно чтоб курсор приехал в координаты 700,750 (панель задач), ПКМ, координаты 700, 695 (на строчку "диспетчер задач"), ЛКМ. Нашел это, пока мало что понятно, разбираюсь...http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspxhttp://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx

  1. Доброго времени суток, уважаемые обыватели КиберФорума. Заканчивая работу над курсовым проектированием, приступил к отладке программы (задача программы - работа с информацией - добавление, удаление, редактирование, просмотр, сохранение в выходной форме) и решил, что листинг таблицы сотрудников, который сделал я (пример - ниже), не очень-то подойдёт для работы со списками в 500-1000 сотрудников (прокрутка осуществляется при помощи клавиш 'вверх' и 'вниз' - при этом справа от таблицы появляется курсор-бегунок, который указывает на конкретный элемент - и листать таблицу таким образом, чтобы дойти, допустим, до 755 сотрудника, будет не совсем удобно, да и времени займёт немало). Поэтому я решил добавить 2 дополнительных цикла 'case' с клавишами PageUp и PageDown (которые, соответственно, обеспечивали бы полистовую прокрутку - за одно нажатие таблица бы переходила к очередному набору сотрудников. Поскольку пишу программу я на Си, а экран DOS ограничен по-вертикали, пришлось ограничить количество выводимых элементов (сотрудников) до 18 (остальное пространство - вывод 'шапки' и 'подвала' таблицы). Суть моего вопроса: как запрограммировать распознавание нажатия клавиш PageUp и PageDown (в данный момент всё, что я знаю - это: клавиша 'вниз' - код '80', клавиша 'вверх' - '72', клавиша 'Escape' - '27') Заранее всем заглянувшим и откликнувшимся большое спасибо. Жду ваших ответов... P.S.: вот, собственно, исходник процедуры просмотра таблицы:C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 void view_table()               /*процедура просмотра таблицы исходных данных*/ { if (count>0) {  listptr temp;                  /*переменная типа 'указатель'*/  clrscr();                  /*очистка экрана*/  char c;                    /*объявление перменной 'c' типа 'char'*/  int curpos = 0,ppos = 0;           /*переменные для контроля поцизии курсора-бегунка*/  temp=top;                  /*в указатель temp передать начало списка*/  while(1)                 {                   clrscr();                 /*очистка экрана*/    print_shapka();              /*вызов процедуры печати 'шапки' таблицы*/     for(int i=1;i<=18;i++)          /*от 1 до 18 элементов*/     {      if (temp!=NULL)                /*если есть элемент*/       {     if (temp->info.pol==1) c='М'; else c='Ж';   /*определение пола относительно поля 'info.pol'*/     printf("в•‘%2dв”‚ %-16s в”‚%4dв”‚%3cв”‚ %-13sв”‚%4dв”‚%4dв”‚%4dв”‚%4dв”‚%6dв•‘\n",temp->info.id,temp->info.fio,temp->info.godr,c,temp->info.prof,temp->info.staz,temp->info.razr,temp->info.nom_c,temp->info.nom_u,temp->info.summa); /*вывести его на экран*/     temp=temp->next;                /*перейти к слещующему элементу*/       }     };     print_bottom();             /*вызов процедуры печати 'подвала' таблицы*/     char ch;                    /*объявление перменной 'ch' типа 'char'*/     while(1)     {     switch(ch = getch())            /*ожидание нажатия клавиши*/     {      case 80:                   /*если нажата клавиша 'вниз'*/      {       if(curpos < count)            /*если позиция курсора-бегунка меньше количества элементов*/       {        ppos = ++curpos;             /*увеличить позицию будующего и текущего расположения курсора-бегунка*/        gotoxy(76,ppos+4-1);         /*итти к позиции на экране, где размещался предыдущий курсор-бегунок*/        printf("   ");               /*стереть предыдущее изображение куросра-бегунка*/        if(curpos > 18)              /*если позиция курсора-бегунка больше 18*/        {     ppos = 18;              /*запомнить позицию будующего расположения куросора-бегунка в переменной 'ppos'*/     temp = top;             /*в указатель temp передать начало списка*/     for(int i = 0;i < curpos-18;i++)    /*сдвинуть первый выводимый на экран элемент на 1*/     temp = temp->next;          /*сдвинуть первый выводимый на экран элемент на 1*/     clrscr();               /*очистка экрана*/     print_shapka();             /*вызов процедуры печати 'шапки' таблицы*/     for(int j = 0;j < 18;j++)       /*от 1 до 18 элементов*/      {       if(temp)              /*если есть элемент*/       {        if(temp->info.pol==1) c='М'; else c='Ж'; /*определение пола относительно поля 'info.pol'*/        printf("в•‘%2dв”‚ %-16s в”‚%4dв”‚%3cв”‚ %-13sв”‚%4dв”‚%4dв”‚%4dв”‚%4dв”‚%6dв•‘\n",temp->info.id,temp->info.fio,temp->info.godr,c,temp->info.prof,temp->info.staz,temp->info.razr,temp->info.nom_c,temp->info.nom_u,temp->info.summa); /*вывести его на экран*/        temp = temp->next;               /*перейти к слещующему элементу*/       }      }      print_bottom();            /*вызов процедуры печати 'подвала' таблицы*/        }       }       gotoxy(76,ppos+4);            /*итти к позиции на экране, где нужно напечатать курсор-бегунок*/                 printf("<<<");                /*напечатать курсор-бегунок*/       break;                    /*выход из цикла*/      }      case 72:                   /*если нажата клавиша 'вверх'*/      {       if(curpos > 0)       {        ppos--;                  /*уменьшить позицию будующего расположения курсора-бегунка*/        if(ppos < 0) ppos = 0;           /*если позиция будующего расположения куросра-бегунка меньше 0*/        curpos--;                /*уменшить текущую позицию курсора-бегунка*/        gotoxy(76,ppos+4+2);         /*итти к позиции на экране, где размещался предыдущий курсор-бегунок*/        printf("   ");               /*стереть предыдущее изображение куросра-бегунка*/        if(curpos >= 0)              /*если текущая позиция курсора-бегунка больше либо равно 0*/        {     if(ppos == 0)               /*если позиция будующего расположения курсора-бегунка равна 0*/     {      temp = top;                /*в указатель temp передать начало списка*/      for(int i = 0;i < curpos;i++)      /*сдвинуть первый выводимый на экран элемент на 1*/      temp = temp->next;         /*сдвинуть первый выводимый на экран элемент на 1*/      clrscr();              /*очистка экрана*/      print_shapka();            /*вызов процедуры печати 'шапки' таблицы*/      for(int j = 0;j < 18;j++)      /*от 1 до 18 элементов*/       {        if(temp)             /*если есть элемент*/        {         if(temp->info.pol==1) c='М'; else c='Ж';    /*определение пола относительно поля 'info.pol'*/         printf("в•‘%2dв”‚ %-16s в”‚%4dв”‚%3cв”‚ %-13sв”‚%4dв”‚%4dв”‚%4dв”‚%4dв”‚%6dв•‘\n",temp->info.id,temp->info.fio,temp->info.godr,c,temp->info.prof,temp->info.staz,temp->info.razr,temp->info.nom_c,temp->info.nom_u,temp->info.summa);         temp = temp->next;              /*перейти к слещующему элементу*/        }       }       print_bottom();           /*вызов процедуры печати 'подвала' таблицы*/        }}       }       gotoxy(76,ppos+4+1);          /*итти к позиции на экране, где нужно напечатать курсор-бегунок*/       printf("<<<");                /*напечатать курсор-бегунок*/       break;                    /*выход из цикла*/      }      case 27 : return;              /*если нажата клавиша 'Escape' - выйти из процедуры просмотра таблицы*/     }     }   } } };P.S.S.: 2 скрина - первый - просто таблица, второй - таблица с тем самым курсором-бегунком.

  1. Мне надо, чтобы после ввода, курсор в консоли оставался на прежнем месте. Частично, этого я смог добиться при помощи функции SetConsoleCursorPosition, установив курсор после ввода в нужное место. Но если нажать энтер, не введя ничего, или пока scanf не считает требуемое количество чисел, нажатие энтера приведет к возврату каретки с переводом на новую строку и не было бы проблемы, если бы с энтером сканф завершал свою работу, я бы проверил сколько чисел он считал и после этого установил бы курсор в нужное место, но сканф все так же ждет ввода чисел. Пытался использовать "%[^\n]" но ничего путного из этого не вышло. Можете вообще объяснить доступно принцип работы потока ввода? Я понимаю это так: все что вводится с клавиатуры сразу попадает в поток, затем обрабатывается, если это не управляющий символ то просто выводится, скажем, нажав в консоли клавишу "а", я закину символ "а" в поток ввода, тот чем-то обработается и выведется на экран, если после этого я допишу что-нибудь еще, произойдет тоже самое, а вот если я нажму клавишу "backspace" символ "\b" попадет в поток, обработается, после чего произойдет отбрасывание предыдущего символа из потока и символа "\b", после отображение в консоли перевода каретки на одну позицию влево, нажатие энтера приведет к записи символа "\n" в поток, и отображение его в консоли в виде перевода каретки на новую строку. Поправьте где ошибаюсь, и дополните пожалуйста, если что-то упустил, просто в интернете не нашел ничего настолько разжеванного, возможно не правильно искал.

  1. C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 typedef{int x; int y;} crd;   int control(crd *playerCrd) {     switch(getch())     {         case 87: /*должна быть W*/             playerCrd->x++;             return 2;         case 27: /*ESC*/             return 1;         default:             return 0;     } }почему на 27 функция реагирует, а на 87 - нет? (если вместо 87 написать 'w', то функция реагирует). Код клавиш брал отсюда: http://netcode.ru/cpp/?artID=234 P.s. Пытаюсь решить проблему считывания клавиш вне зависимости от раскладки .

  1. Есть консольное приложение под Windows (в Visual Studio). Нужно, чтобы при нажатие на какую-либо клавишу или сочетание клавиш, программа выполняла какаие-то действия. При этом, программа должна выполнять свои основные действия, а не крутиться в бесконечном цикле в ожидании нажатия клавиши. Подскажите пожалуйста, как это можно реализовать?

  1. Задача такова: 1. Программа создает файл. 2. Программа начинает записывать в файл числа от 0 до 9 (без пробелов и иных разделителей). После каждой 9 опять следует 0. 3. Пункт №2 работает до того момента, пока мы не нажмем любую клавишу на клавиатуре. 4. Программы берет цифры, стоящие правее, чем последний ноль. И кладет их во 2 файл. 5. Программа записывает сумму и вывод ее в 3 файл. Не могу понять как реализовать пункт №3. Помогите!

  1. Как это сделать, чтобы получался правильный широкий символ? Нужно прочитать только 1 символ. Как getсhar(), только для широких