Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 08.05.2021
Сообщений: 22

Ошибка при проверке ввода нецифрового символа

12.05.2021, 17:19. Показов 664. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Недавно начал изучать С++ и столкнулся с проблемой.
Суть: мне нужно запретить ввод букв и ограничить условиями ввод определенных цифр.
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
void one()
{
    int v0 = 0;
    cout << "Текст";
l1: cout << "Возврат к тексту";
    cin >> v0;
    if (v0 == 1)
    {
        // не написал еще
    }
    else if (v0 == 2)
    {
              // не написал еще
    }
    else if (v0 == 3)
    {
        cout << "Дальнейший текст";
    }
    else if (v0 <= 0 || v0 > 3)
    {
        cout << "Ошибка";
        goto l1;
    }
    else if (!isdigit(v0))
    {
        cout << "Ошибка";
                goto l1;
 
    }
 
}
Всё работает, но когда в консоль ввожу букву или буквы, то возникает флуд ошибками. Когда переставляю местами и убираю из последнего goto l1, то всё работает, но без функции goto (возврата к строке) мне не обойтись.
C++
1
2
3
4
5
6
7
8
9
10
        else if (!isdigit(v0))
    {
        cout << "Ошибка";
                goto l1;
 
    }
    else if (v0 <= 0 || v0 > 3)
    {
        cout << "Ошибка";
    }
Скажите пожалуйста, как изменить код или что делать, чтобы это заработало? Мне нужно ограничить ввод букв. Выглядит это так: 1. Ошибка > 2. Переход к строке повторного ввода.
Ну, а у меня же: 1. Ошибка > 2. Бесконечный флуд строкой к которой выполнен переход.
Примерно такое выдает:
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.05.2021, 17:19
Ответы с готовыми решениями:

Неправльная работа программы при вводе нецифрового символа
если ввести в этот код не цифру про программа уходит в вечный цикл. почему так происходит и что можно сделать? int d = 0; do ...

Зацикливается программа при проверке корректность ввода
Добавил в программу проверку на корректный ввод: flag=scanf(&quot;%d&quot;,&amp;l.num); while (1&gt;flag) { puts(&quot;Vvodit mojno tolko...

Сайт CodeWars при проверке решения выдаёт ошибку, при проверке в VisualStudio ошибки нет
Задача написать метод,который будет проверять порядок круглых скобок. Написал код, проверил в Visual Studio, всё нормально. ...

8
 Аватар для stdin
129 / 81 / 49
Регистрация: 10.01.2020
Сообщений: 293
12.05.2021, 17:23
Nikolay38Rus, в таком случае вводите в строку, а потом проверяйте ее на наличие нужных/ненужных вам символов.
0
0 / 0 / 0
Регистрация: 08.05.2021
Сообщений: 22
12.05.2021, 17:27  [ТС]
Цитата Сообщение от stdin Посмотреть сообщение
Nikolay38Rus, в таком случае вводите в строку, а потом проверяйте ее на наличие нужных/ненужных вам символов.
А можно код как это сделать?
0
 Аватар для stdin
129 / 81 / 49
Регистрация: 10.01.2020
Сообщений: 293
12.05.2021, 17:40
Nikolay38Rus, тогда вам будет трудно ограничить ввод определенных цифр.
0
0 / 0 / 0
Регистрация: 08.05.2021
Сообщений: 22
12.05.2021, 17:42  [ТС]
Цитата Сообщение от stdin Посмотреть сообщение
Nikolay38Rus, тогда вам будет трудно ограничить ввод определенных цифр.
Цифры я знаю как ограничивать. Мне нужно ограничить ввод букв, точнее и это я сделал. Я не понимаю почему при переходе на заданную мною строку выводит флуд написанной ошибкой.
0
Заблокирован
12.05.2021, 17:49
Code
1
2
 l1: cout << "Возврат к тексту";
+    cin.clear(cin.rdstate() & ~ios_base::failbit);
0
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,238
12.05.2021, 17:56
Цитата Сообщение от Nikolay38Rus Посмотреть сообщение
else if (!isdigit(v0))
v0 - это целое число int, а функция isdigit проверяет символ (char) на то,
что в нем содержатся коды в диапазоне от кода нуля до кода девятки.

Вам уже дали дельный совет:
C++
1
2
3
4
5
6
7
string txt;
getline(cin,txt);
if(txt[0]<'0' || txt[0]>'9')
{
    cout << "Ошибка";
}else
   v0=atoi(txt.c_str());
0
0 / 0 / 0
Регистрация: 08.05.2021
Сообщений: 22
13.05.2021, 15:07  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
v0 - это целое число int, а функция isdigit проверяет символ (char) на то,
что в нем содержатся коды в диапазоне от кода нуля до кода девятки.

Вам уже дали дельный совет:
C++
1
2
3
4
5
6
7
string txt;
getline(cin,txt);
if(txt[0]<'0' || txt[0]>'9')
{
    cout << "Ошибка";
}else
   v0=atoi(txt.c_str());
Благодарю за ответ. Но проблема остается при добавлении goto, флуд бесконечный. После ошибки мне необходимо сделать переход на строку ввода, где и была допущена ошибка.
0
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,238
13.05.2021, 17:52
Цитата Сообщение от Nikolay38Rus Посмотреть сообщение
проблема остается при добавлении goto
Приведите получившийся текст.
У Вас должно было получиться что-то вроде
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
#include<iostream>
#include<string>
#include<clocale>
#include<cstdlib>
using namespace std;
void one()
{
    int v0=0;
    string txt;
    cout << "Текст\n";
    do
    {
        cout << "Введите число в диапазоне [1,3]:";
        getline(cin,txt);
        if(txt[0]<'0' || txt[0]>'9')
        {
            cout << "Ошибка\n";
        }else
        {
            v0=atoi(txt.c_str());
            if(v0 <= 0 || v0 > 3)
            {
                cout << "Ошибка\n";
            }
        }
    }while( txt[0]<'0' || txt[0]>'9' || v0 <= 0 || v0 > 3 );
    switch(v0)
    {
    case 1:
        cout << "не написал еще\n";
        break;
    case 2:
        cout << "не написал еще\n";
        break;
    case 3:
         cout << "Дальнейший текст";
         break;
    }
} 
int main()
{
    setlocale(LC_ALL,"Rus");
    one();
    cin.get();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.05.2021, 17:52
Помогаю со студенческими работами здесь

Исключение IOException, которое появляется при ввода буквенного символа в методе ввода с клавиатуры целых чисел
Ввожу в catch IOException, а не нравится, что делать? import java.io.IOException; import java.util.Scanner; public class MyClass {...

Ошибка при проверке
∞ Ʃ ((-1)^n) *((x^n)/((2*n)!)) n=0 an=((-1)^n) *((x^n)/((2*n)!)) an-1=((-1)^n-1) *((x^n-1)/((2*n-1)!)) ...

При проверке типа вводимых данных возникает ошибка при вводе иррациональных чисел
На просторах интернета я нашел следующий цикл,отвечающий за проверку типов вводимых данных: while (!(cin &gt;&gt; timesec) || (cin.peek()...

При установке iRedMail ошибка при проверке md5sum
При установке iRedmail сервера на Linux появляется ошибка при выполнении команд: # cd iRedMail-0.9.3 # sh iRedMail.sh окно ошибки: ...

Ошибка при проверке задания
Задание: Пафнутий безумно (да он слегка безумен (как и большинство наших знакомых (да, мы любим вложенные комментарии))) любит...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru