Помощь с вводом символов и печатью на C ++ - PullRequest
0 голосов
/ 09 марта 2010

Я хочу читать символы из консоли и печатать их один за другим, только если они имеют определенное значение.

Ну, я попытался использовать что-то вроде этого:

char c;

while (c != '\n') {
       c = getch();
       if (printable(c)) cout << c; // where printable is a function which checks 
                                    // if the character is of a certain value
}  

Но этоне работает, так как печатает все символы, так что есть идеи, что мне использовать?

Большое спасибо!

Редактировать

Ну, яВы хотите создать полиномиальный калькулятор, в котором пользователь вводит термины до нажатия Enter, но если, например, пользователь вводит «r» или «R», он сбрасывает ввод или «q» и «Q», чтобы выйти из программы, а также дажеесли пользователь вводит недопустимые символы, такие как '@', ',', ';' и т. д. (также я не хочу печатать 'r' или 'q'), они не будут печататься на экране.

Также вот функция печати:

bool printable(char c) 
    {

        return (
                  ((int(c) > 42 && int(c) < 123) || isspace(c)) && int(c) != 44 && int(c) != 46 && int(c) != 47 && 
                  int(c) != 58 && int(c) != 59 && 
                  int(c) != 60 && int(c) != 61 && int(c) != 62 && int(c) != 63 && int(c) != 64 && int(c) != 65 && 
                  int(c) != 91 && int(c) != 92 && int(c) != 93 && int(c) != 95 && int(c) != 96
                ); 
    }

Ответы [ 4 ]

2 голосов
/ 09 марта 2010

Вы можете изменить свой оператор cout на cout << "You just typed: " << c; Таким образом, вы сможете увидеть, успешно ли выполнено условие if. Также пост для печати ().

Вот пример простого захвата символа, не уверенный, почему вы используете getch (), вы должны использовать cin.get, но в любом случае для вашего примера:

bool isPrintable(char c)
 {
     bool isItPrintable=false;

     if ((int)c >= 65)
        isItPrintable=true;

        return isItPrintable;
 }

int main()
{
    char c;

    while (c != '\r')
      {
           c=getch();
           if (isPrintable(c))
             {
                cout << "You just entered: " << c << endl;
             }
      }
    return 0;
}

Для всех, кому интересно, getch () доступен в conio.h. В моем случае я просто проверяю представление int для символа и, если оно> 65, возвращает true, иначе false.

EDIT

Влад, причина, по которой w и z оба появляются, заключается в том, что их десятичное представление w равно 119, а z равно 123. Теперь ваша функция isPrintable имеет условие if, которое допускает это:

(int(c) > 42 && int(c) < 123)

Это даст значение TRUE, поэтому, если вы не хотите использовать w, вам нужно ограничить этот диапазон.

1 голос
/ 09 марта 2010

Есть много способов проверить, можно ли печатать символ:

  1. isprint() (библиотечная процедура)
  2. Сравнить символ за символом (через if)
  3. Поиск строки известных символов
  4. Таблица поиска

Библиотека рутина isprint

Эта функция поставляется с языками C и C ++. Прочитайте справочную страницу: isprint функция

Сравнение символа за символом

В вашей функции вы пытаетесь что-то вроде:
return c == 65;
Но более читаемый синтаксис:
return c == 'a';

Поиск строки известных символов

Создайте постоянную строку из для печати символов и найдите ее:

bool is_print(char c)
{
    static const std::string    printable_chars("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    return printable_chars.find(c) != std::string::npos;
}

Таблица поиска:

bool is_print(char c)
{
    static const char printable_chars[] = {'1', '2', '3', '4', '5', '6'};
    return std::binary_search(printable_chars,
                              printable_chars + sizeof(printable_chars),
                              c);
}
1 голос
/ 09 марта 2010

Вы пытаетесь сделать что-то подобное?

bool printable(char c)
{
    if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
    {
        return true;
    }
    return false;
}

int main()
{
  char c = ' ';

    while (c != '\r') {
           c = _getch();
    if (printable(c)) cout << c; // where printable is a function which checks 
                                        // if the character is of a certain value
    }  
}

Это напечатало бы только буквы и завершило программу нажатием клавиши возврата

0 голосов
/ 09 марта 2010

Он не печатает все символы, ваше окно терминала отображает символы, которые вы вводите. Вы бы увидели это более ясно, если бы вы запустили это как program < some_file

В коде есть и другие недостатки ( например, что он делает, когда больше нет символов?), Но это другие вопросы.

...