1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 42
1

Работа с cin

04.10.2020, 15:46. Показов 2000. Ответов 8

Здравствуйте! Столкнулся с задачей - "При считывании с клавиатуры n количества символов не дать пользователю записать большее количество. Обозначить это графически"
То бишь если ограничение 17 символов, то при вводе 18 символа, он даже не появляется на экране. Смог только ограничить запоминание, но он все равно появляется на экране. Как это сделать?
C++
1
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
         cout << "\nВведите следующие данные (Латиница. Ограничение 17 символов)" << endl;
         cout << "Название изделия: ";
         while (1)
    {
        if (fgets(z, 18, stdin) != 0)
        {
            if (z[strlen(z) - 1] != '\n')
            {
                while (cin.get() != '\n')
                    ; // очистка неиспользованных символов
            }
            else
            {
                z[strlen(z) - 1] = '\0';
            } // заменяет 18 (если он есть) на нулевой, так так ограничение в моем случае 17.
                          // далее идет проверка на то, что введенные символы являются цифрами или буквами
            char* ch = new char[18];
            strcpy(ch, z);
            for (int j = 0; j < strlen(ch); j++)
            {
                if (isdigit(ch[j]) || isalpha(ch[j]) || ch[j] == 32)
                {
                    ;
                }
                else
                {
                    p++;
                    break;
                }
            } 
 
            if (p == 0)
            {
                strcpy(arr[i].farm, z);
                break;
            }
            else
            {
                cout << "\nНе корректный ввод. Повторите попытку: ";
                p = 0;
            }
        }
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2020, 15:46
Ответы с готовыми решениями:

Как работает cin.peek, cin,get, cin.ignore, cin.clear?
Здравствуйте, товарищи и не товарищи!:) Я только начал изучать C++, а уже использую вещи, которые...

Защита от дурака при вводе текста с помощью: cin.get cin.clear cin.sync
Доброго времени суток. На С++ учусь с недавних пор. Имеется стандартная &quot;защита от дурака&quot; на ввод....

Объясните пожалуйста как работают cin.good(), cin.sync(), cin.clear()
Такая проблема: сдаю в вуза лабораторные по программированию, писал все сам, до этого c++ не...

Работа с cin
Как запретить писать все символы, кроме цифр? Я про то, когда пользователь тыцкает на букву, а ему...

8
Параллельный Кот
1904 / 826 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
04.10.2020, 15:55 2
На каком экране? Программа полностью владеет экраном или ввод/вывод отображается в окне эмулятора терминала?
0
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 42
04.10.2020, 16:00  [ТС] 3
Цитата Сообщение от valen10 Посмотреть сообщение
На каком экране? Программа полностью владеет экраном или ввод/вывод отображается в окне эмулятора терминала?
Терминал через visual studio
0
Параллельный Кот
1904 / 826 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
04.10.2020, 19:09 4
Лучший ответ Сообщение было отмечено Aderom как решение

Решение

Цитата Сообщение от Aderom Посмотреть сообщение
Терминал через visual studio
Подобные вопросы периодически встречаются на страницах форума. Стандартного решения не встречал. Как вариант, перевести терминал в режим raw и обрабатывать события клавиатуры.
Кликните здесь для просмотра всего текста
C++
1
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
#include <iostream>
#include <Windows.h>
 
void get_limited_string(char *dst, size_t size) {
    const HANDLE std_in = GetStdHandle(STD_INPUT_HANDLE);
 
    // Сохранить текущие настройки терминала.
    DWORD console_mode;
    GetConsoleMode(std_in, &console_mode);
 
    // Перевести терминал в неканонический режим (raw).
    SetConsoleMode(std_in, 0);
 
    INPUT_RECORD ir;
    DWORD num_read;
    size_t pos = 0;
 
    while (ReadConsoleInput(std_in, &ir, 1, &num_read)) {
        // Обрабатываем только события нажатия клавиш.
        if ((ir.EventType == KEY_EVENT) && (ir.Event.KeyEvent.bKeyDown)) {
            const char code = ir.Event.KeyEvent.uChar.AsciiChar;
 
            if (code == '\r') { // Нажат Enter.
                std::cout << '\n';
                break;
            }
            else if ((code == '\b') && (pos > 0)) { // Нажат Backspace.
                std::cout << "\b \b";
                --pos;
            }
            else if ((code >= ' ') && (pos + 1 < size)) { // Нажата клавиша с печатным символом.
                std::cout << code;
                dst[pos++] = code;
            }
        }
    }
 
    // Конец строки.
    dst[pos] = 0;
 
    // Восстановить настройки терминала.
    SetConsoleMode(std_in, console_mode);
}
 
int main() {
    const size_t size{ 5 };
    char buf[size];
 
    get_limited_string(buf, size);
    std::cout << buf << std::endl;
 
    system("pause");
    return 0;
}

Или использовать библиотеки управления терминалом, Ncurses например.
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
04.10.2020, 19:36 5
Цитата Сообщение от Aderom Посмотреть сообщение
То бишь если ограничение 17 символов, то при вводе 18 символа, он даже не появляется на экране. Смог только ограничить запоминание, но он все равно появляется на экране. Как это сделать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
while (1)
{
    cout << "\nВведите следующие данные (Латиница. Ограничение 17 символов)" << endl;
    cout << "Название изделия: ";
 
    std::string s;
    std::cin >> s;
    if (s.size() > 17)
        std::cout << "Некорректный ввод. Повторите попытку" << std::endl;
    else
    {
.........................................................       
    }
}
0
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 42
04.10.2020, 19:42  [ТС] 6
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
C++
Нужен тип данных char
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
04.10.2020, 19:44 7
Цитата Сообщение от Aderom Посмотреть сообщение
Нужен тип данных char
C++
1
2
3
    char sp[255];
    std::cin >> s;
    if (strlen(s) > 17)
0
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 42
04.10.2020, 19:56  [ТС] 8
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
C++
Вы не правильно поняли суть вопроса. Мне нужно чтобы в терминале не отображались набираемые символы, если они превышают 17, а вы предложили проверку после ввода, что никак не взаимодействует с управлением терминалом
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
04.10.2020, 20:10 9
Лучший ответ Сообщение было отмечено Aderom как решение

Решение

Цитата Сообщение от Aderom Посмотреть сообщение
Вы не правильно поняли суть вопроса. Мне нужно чтобы в терминале не отображались набираемые символы, если они превышают 17, а вы предложили проверку после ввода, что никак не взаимодействует с управлением терминалом
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        size_t n = 0;
 
        char s[18];
        for (;;)
        {
            const char ch = _getch();
            if (ch == 13)
            {
                std::cout << std::endl;
                break;
            }
            if (n < 17)
            {
                s[n++] = ch;
                std::cout << ch;
            }
        }
 
        s[n] = 0;
        std::cout << s << std::endl;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.10.2020, 20:10
Помогаю со студенческими работами здесь

Работа с потоком cin
Есть ситуация. Нужно проверить, есть ли в потоке cin какие либо символы, исходя из этого сделать...

Некорректная работа cin.fileget()
Здорова господа!!! Пытаюсь разобраться с потоками ввода/вывода вот есть код: #include...

Некорректная работа cin.getline()
Доброго времени суток,господа знатоки. у меня есть двумерный массив char куда мне нужно записать...

Работа std::cin, >>, буфер данных
Начинаю изучать C++, наткнулся на такую проблему, после ввода данных от пользователя через консоль...

Метод getline(cin, m) не срабатывает без cin.ignore() / Ревью кода
Почему в моем случае getline(cin, m) не срабатывает без cin.ignore() ? Если по коду есть...

Продемонстрировать различие между вводом с помощью cin.Get и cin.Getline с тремя параметрами
Нужна помощь. Задача продемонстрировать различие между вводом с помощью cin.get и cin.getline с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru