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

Проблема с вводом данных (getchar, fgets)

12.09.2020, 13:07. Показов 1077. Ответов 3

Столкнулся с проблемой, что данный код, когда вводишь не максимальное количество допустимых символов, дополнительно просит нажать Enter для запоминания (возможно уже запомнил, но чтобы перейти к следующей части программы, нужно нажать Enter)

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
    struct zavod
    {
        char *farm;
        int type;
        double weight;
        int quant;
        double cost;
    };
 
        char *z = new char[18];
        arr[i].farm = new char[18];
 
    cout << "\nВведите следующие данные (Латиница. Ограничение 17 символов)" << endl;
    cout << "Название изделия: ";
 
    getchar(); // без него не начинает запоминание fgets
    if ( fgets(z1, 18, stdin) != 0 ) 
    {
        if (strlen(z1) < 17)
        {
            z1[strlen(z1) - 1] = '\0';
        }
        strcpy(arr[i].farm, z1);
    }
 
    cin.clear();
    while (cin.get() != '\n') // очистка не использованных символов
    {   
          continue;
    }
        // далее другая часть кода, которая работает.
        // (Отправляю из-за того что, возможно, как-то влияет на верхнюю часть,
        // но сильно сомневаюсь
 
    cout << "Тип изделия (1 - булочка, 2 - пирожок, 3 - пирожное, 4 - другое): ";
    cin  >> z;
    while (1 == 1)
    {
        if (isdigit(*z) && *z < 53 && *z !=48 && (z[1] == '\n' || z[1] == '\0'))
        {
            a = atoi(z);
            cout << a << endl;
            arr[i].type = a;
            break;
        }
        else
        {
            cout << "\nНе корректный ввод. Повторите попытку: ";
            cin >> z;
        }
    }
Я хочу сделать так, чтобы не нужно было нажимать Enter дважды после указания названия товара
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.09.2020, 13:07
Ответы с готовыми решениями:

Проблема с вводом данных (getchar, fgets)
...

Проблема с вводом данных
Нужно ввести две строки, первая строка единственное число a – количество элементов целочисленного...

Проблема с вводом данных типа String с клавиатуры
У меня есть к примеру вот такая часть кода и мне необходимо ввести данные с клавиатуры (несколько...

си для начинающих проблема с функцией fgets
есть задача: считать с файла строки и вывести на экран все строчки, в которых есть слова, где...

3
Модератор
Эксперт С++
12099 / 9772 / 5908
Регистрация: 18.12.2011
Сообщений: 26,235
12.09.2020, 13:21 2
Цитата Сообщение от Aderom Посмотреть сообщение
if ( fgets(z1, 18, stdin) != 0 )
fgets считывает всю строку ВКЛЮЧАЯ \n (и помещает \n в прочитанную строку).
поэтому
Цитата Сообщение от Aderom Посмотреть сообщение
while (cin.get() != '\n') // очистка не использованных символов
{
continue;
}
делать не нужно

И, кстати, когда понадобиться подобный код, лучше пишите его так
C++
1
2
while (cin.get() != '\n') 
   ;  // очистка неиспользованных символов
1
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 42
12.09.2020, 13:49  [ТС] 3
Спасибо, но решив эту проблему, вы автоматически создаете другую. Мне все же нужно очищать буфер, если пользователь введет больше 17 значений

Добавлено через 7 минут
Цитата Сообщение от zss Посмотреть сообщение
поэтому
Сообщение от Aderom
while (cin.get() != '\n') // очистка не использованных символов
{
continue;
}
делать не нужно
И так, я убрал данный кусок. Дабл Enter пропал, но при вводе мной 18 значений и более, они уходят на следующий вызов, указанный в этой же теме.
0
Модератор
Эксперт С++
12099 / 9772 / 5908
Регистрация: 18.12.2011
Сообщений: 26,235
12.09.2020, 13:50 4
Лучший ответ Сообщение было отмечено Aderom как решение

Решение

Ну, тогда проверяйте последний введенный символ
C++
1
2
3
4
5
6
if (z1[strlen(z1]-1]!='\n')
{
   while (cin.get() != '\n') 
     ;  // очистка неиспользованных символов
}else
   z1[strlen(z1]-1]='\0'; // заодно можно убрать \n из введенной строки
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.09.2020, 13:50
Помогаю со студенческими работами здесь

Проблема с вводом
Приветствую! Писал уже на форум насчет проблемы, которую мне помогли устранить, но в следствии чего...

Проблема со вводом
Здравствуйте, в коде присутствует ошибки не могу разобраться как исправить. Помогите пожалуйста....

проблема с вводом
#include &lt;iostream&gt; #include &lt;queue&gt; // очередь #include &lt;vector&gt; // очередь using namespace...

Проблема с вводом из файла
Всем привет. Нужно написать викторину. Сделал для этого такую структуру. Которая хранит вопрос,...

Проблема с вводом строки
Здравствуйте, столкнулась с такой проблемой: мне необходимо написать калькулятор постфиксной...

Проблема с вводом числа
Решаю легкую задачку на степике. Решение написал, но столкнулся ошибкой, которую вижу впервые:...


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

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

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