Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.65/79: Рейтинг темы: голосов - 79, средняя оценка - 4.65
 Аватар для Hotbed
50 / 4 / 0
Регистрация: 02.04.2011
Сообщений: 60

Ввод в консоле только чисел(запрет ввода других символов)

19.05.2011, 16:39. Показов 15872. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В консольном варианте с предложением пользователю ввести фразу, содержащую и цифры и буквы, чтоб потом программа после ввода исключала буквы и выводила строку состоящую только из чисел

у меня вот какая зарисовка только че то не работает, а точнее работает если строка содержит сначала ряд чисел а после нее идут буквы. Воможно я сделал ошибку (я так думаю), в том что при обнаружении в строке буквы, все последующие символы тоже обнуляются. Подскажите в чем я не прав.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# include <iostream>
# include <cstdio>
# include <cstring>
using namespace std;
int main()
{
char *A; A=new char[20];
 
gets(A);
int a = strlen(A);
//cout << " \n"<< a ;
 
    for (int i=0; i<a;i++)
    {if (*(A+i)>'9')
    {*(A+i)=0x00;continue;}
    if (*(A+i)<'0')
    {*(A+i)=0x00;continue;}}
int c = strlen(A);
//cout << " \n"<< c ;
for (int t=0; t<c;t++)
cout << "\n" << *(A+t);
cin.get();
}
Может я не правильно заменяю символы может в *(A+i)=0x00; поставить что нибудь другое? Подскажите пожалуйста.

И второй вопрос как сделать так чтобы при вводе пользыватель не смог вводить буквы и другие символы.Слышал это можно реализовать по средствам функции getch. Заранее благодарю.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.05.2011, 16:39
Ответы с готовыми решениями:

Запрет ввода символов в консоли
моя консольная программа имеет очень много вводов от пользователя, через контекстное меню (нажмите 1 для того, 2 для другого) чтоб не...

Запрет ввода символов в поле Edit
Как запретить нажатие и вставку из буфера всех символов, кроме нужных мне, к примеру разрешить вводить в поле только цифры? И еще 2-ой...

Запрет ввода символов, отличных от цифр
Нужно заполнить двумерный массив только числами. Как это реализовать?

26
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
19.05.2011, 17:07
Цитата Сообщение от Hotbed Посмотреть сообщение
И второй вопрос как сделать так чтобы при вводе пользыватель не смог вводить буквы и другие символы.Слышал это можно реализовать по средствам функции getch.
ИМХО: getch() нестандартная ф-ция, поэтому нежелательно ее юзать (я ее вообще не использую).
Вот, посмотри, там то, что тебе нужно средствами WinAPI. Там правда совсем сырой код, но суть должна быть понятна.
1
152 / 150 / 44
Регистрация: 09.02.2010
Сообщений: 407
19.05.2011, 17:37
Hotbed, вот реализация на Си:
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
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
 
void remove_alpha(char* t, const int n)
{
    int i, j;
    for(i = 0, j = 0; t[i] != '\n' ; i++)
        if(isdigit(t[i]))
        {
            t[j++] = t[i];
        }
    t[j] = '\0';
}
 
int main()
{
    char *A;
    const int n = 20;
    A = (char*) malloc(n*sizeof(char));
    fgets(A, n, stdin);
    remove_alpha(A, n);
    if (A[0] != '\n')
        printf("%s\n", A);
    else
        printf("\nСтрока не содержит цифр!\n");
    getchar();
    free(A);
    A = NULL;
    return 0;
}
1
 Аватар для Hotbed
50 / 4 / 0
Регистрация: 02.04.2011
Сообщений: 60
19.05.2011, 17:54  [ТС]
Спасибо Kastaneda, только сложновато для моего уровня, но ведь трудности это хорошо, буду изучать дескрипторы консоли и Ваш код а потом попробую разобраться почему Вы его назвали "сырым".

dampir_sanek Спасибо давно искал пример на fgets с такой потребностью как у меня. Буду разбиратся с кодом, если что задам вопрос.
0
152 / 150 / 44
Регистрация: 09.02.2010
Сообщений: 407
19.05.2011, 17:56
Переработал фунцию remove_alpha, ей не нужен параметр n:
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
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
 
void remove_alpha(char* t)
{
    int i, j;
    for(i = 0, j = 0; t[i] != '\n'; i++)
        if(isdigit(t[i]))
            t[j++] = t[i++];
 
    t[j] = '\0';
}
 
int main()
{
    char *A;
    const int n = 20;
    A = (char*) malloc(n*sizeof(char));
    fgets(A, n, stdin);
    remove_alpha(A);
    if (A[0] != '\n')
        printf("%s\n", A);
    else
        printf("\nСтрока не содержит цифр!\n");
    getchar();
    free(A);
    A = NULL;
    return 0;
}
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
19.05.2011, 17:57
Цитата Сообщение от Hotbed Посмотреть сообщение
Спасибо Kastaneda, только сложновато для моего уровня, но ведь трудности это хорошо, буду изучать дескрипторы консоли и Ваш код а потом попробую разобраться почему Вы его назвали "сырым".
Вот в помощь. Там все, что нужно знать для работы с консолью Windows.
1
 Аватар для Hotbed
50 / 4 / 0
Регистрация: 02.04.2011
Сообщений: 60
19.05.2011, 19:25  [ТС]
Цитата Сообщение от dampir_sanek Посмотреть сообщение
Переработал фунцию remove_alpha, ей не нужен параметр n:
Не большая ошибочка в строчке t[j++] = t[i++]; ---------> t[j++] = t[i];
Вопрос такой почему функция remove_alpha ни чего не возвращает (Void) ?
0
152 / 150 / 44
Регистрация: 09.02.2010
Сообщений: 407
19.05.2011, 20:47
Hotbed, ага, правильно ошибку поправил. Потому что передается указатель на область памяти, и соответсвенно изменяется переданный массив, а не его копия. Поэтому возвращать ничего и не нужно.
0
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
20.05.2011, 10:43
Цитата Сообщение от Hotbed Посмотреть сообщение
как сделать так чтобы при вводе пользователь не смог вводить буквы и другие символы
Если можно пользоваться сторонними библиотеками, то могу одну посоветовать.
0
 Аватар для Hotbed
50 / 4 / 0
Регистрация: 02.04.2011
Сообщений: 60
20.05.2011, 10:55  [ТС]
Цитата Сообщение от gooseim Посмотреть сообщение
Если можно пользоваться сторонними библиотеками, то могу одну посоветовать.
Все методы будут интересны для меня новичка. Я так понял что сторонние библиотеки не всегда хорошо сказываются на безопасности программы. Расскажите о недостатке предложенного в будущем коде.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
20.05.2011, 13:52
Hotbed, Библиотека библиотеке рознь) От буста или локи программа вообщем-то только выиграет.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <string>
#include <iostream>
#include <algorithm>
#include <cctype>
#include <functional>
 
int main()
{
    std::string string;
    std::getline(std::cin, string);
    string.erase(std::remove_if(string.begin(), string.end(), std::not1(std::ptr_fun(&isdigit))), string.end());
    std::cout << string << '\n';
}
0
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
20.05.2011, 14:05
Все методы будут интересны для меня новичка. Я так понял что сторонние библиотеки не всегда хорошо сказываются на безопасности программы. Расскажите о недостатке предложенного в будущем коде.
Не понял. Рассказать о недостатке чего и в каком коде.
0
 Аватар для Hotbed
50 / 4 / 0
Регистрация: 02.04.2011
Сообщений: 60
20.05.2011, 14:33  [ТС]
Цитата Сообщение от gooseim Посмотреть сообщение
Не понял. Рассказать о недостатке чего и в каком коде.
Я про Ваше предложение
то могу одну посоветовать
и
и в каком коде.
В моем будущем коде с применением Вашего совета.
о недостатке чего
сторонней библиотеке
Например есть функция gets но не безопасна альтернатива безопасная fgets
0
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
20.05.2011, 14:36
Ок. Вечером покажу, сейчас у меня нет ее с собой.
0
 Аватар для Hotbed
50 / 4 / 0
Регистрация: 02.04.2011
Сообщений: 60
20.05.2011, 18:29  [ТС]
ForEveR

У меня почему то не работает не выводится введенные символы .
Пробегусь по коду поправьте меня пожалуйста, если я не прав
в строке 9 задаем строку string
в строке 10 помещаем символы со входного потока cin в string
в строке 11 это я так понимаю функциональный объект удаляет один или несколько элементов строки не прошедших проверку по средствам isdigit

Распишу как понимаю каждый объект (функцию) 11 строки
string.erase() - функциональный объект (Удаление всех символов начиная от указанной позиции (конец понятен это string.end() а на счет от чего будет удалять не понятно)


remove_if(string.begin(), string.end(), std::not1(std::ptr_fun(&isdigit)) -

Удаление из указанного участка контейнера объектов выбранных функцией сравнения для - (std::not1(std::ptr_fun(&isdigit))

Не понятно почему обращается по адресу функционального адаптера ptr_fun по адресу (&isdigit). Почему здесь указывается адрес?
string.begin() и string.end() являются интераторами? И как они работают, точнее на что указывают при работе?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
20.05.2011, 19:51
Hotbed, string::erase() функция класса. У нее есть перегруженные версии. Подробнее в гугле.
В данном случае используется версия от двух итераторов. Суть : удаляем из контейнера диапазон начиная от начального итератора, заканчивая конечным (не включая).

Начальный итератор задается возвращаемым итератором функции std::remove_if(), которая принимает два итератора и функтор, в данном конкретном случае мы посылаем туда всю строку, от начала до конца, каждый символ строки посылается в функцию isdigit, на которую мы берем указатель (ptr_fun - синтаксический сахар, ибо not1 (адаптер отрицания для унарного функтора) - принимает исключительно функтор (объект структуры/класса с оператором () )).
Суть : проходим по каждому элементу - смотрим что вернул isdigit, если вернул false - удаляем элемент (точнее сдвигаем в конец уже мусор). std::remove_if() возвращает итератор на начало удаленной последовательности (то есть на первый элемент мусора сдвинутого в конец).

string::begin(), string::end() - функции. Возвращают итератор на первый элемент и на элемент следующий за последним соответственно.
1
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
20.05.2011, 22:50
Вот пример кода, использующий байду, о кот. я говорил:
C++
1
2
3
4
5
6
7
8
9
10
#include "prowin.h"
 
using namespace prowin;
 
int main()
{
   prowin_init();
   int n;
   readint(n);
}
Читает int, запрещая все знаки кроме минуса и цифр. Если минус стоит не в том месте, не заканчивает работу, пока все не будет корректно.

Недостатки:
только под винду
без исходного кода

На счет безопасности, вроде все безопасно.

Там еще есть потоки ввода-вывода на базе stl, но ими слишком сложно пользоваться.
1
 Аватар для Hotbed
50 / 4 / 0
Регистрация: 02.04.2011
Сообщений: 60
22.05.2011, 10:42  [ТС]
Тут покумекал над моим изначальным кодом в шапке темы и кое что придумал. Для таких чайников как я доступно до безобразия. Спасибо всем кто дал темы для размышления. В будущем буду задавать вопросы, если будет что то не понятно.
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
# include <iostream>
# include <cstring>
# include <cstdio>
# define k 80
using namespace std;
int main()
{
    setlocale (LC_ALL, "RUS");
char *A; A=new char[k];
char B[k]={}; 
char C[k]={};
char c =0;
cout << " Программа исключающая все символы, кроме диапазона чисел 0-9 \n\n\n";
cout << " Ведите строчку из любых символов \n";
fgets(A,k,stdin);
int a = strlen(A);
    for (int i=0; i<a;i++)
    {
        if (!((*(A+i))>'9'||(*(A+i))<'0'))
      {     
            for (int d=0;d<1;d++)
            C[d]=A[i];
            strcat(B,C);
        }
        }
cout << " после исключения получили строчку  \n" << B<< endl;        
system ("PAUSE");
}
0
152 / 150 / 44
Регистрация: 09.02.2010
Сообщений: 407
22.05.2011, 14:49
Hotbed, забыл очистить память
C++
1
delete[] A;
1
 Аватар для Hotbed
50 / 4 / 0
Регистрация: 02.04.2011
Сообщений: 60
22.05.2011, 15:50  [ТС]
Цитата Сообщение от dampir_sanek Посмотреть сообщение
Hotbed, забыл очистить память
C++
1
delete[] A;
Да не только забыл очистить, но и не к чему (в 12 строчке) было выделять под размерность в массиве С[k] константное значение надо было выделить памяти ровно на один символ... Да спасибо проглядел.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.05.2011, 15:50
Помогаю со студенческими работами здесь

Запрет ввода любых символов кроме цифр в консоли
Ребята подскажите пожалуйста можно ли как-то разрешать ввод в консоль только цифр. Я делаю проверку или с помощью isdigit() или через...

Ограничение на ввод символов (разрешить ввод только цифр)
Всем доброго времени суток! Я начал изучать С++ и у меня возник такой вопрос: Как ограничить ввод символов (разрешить ввод только...

Запрет ввода чисел
необходимо в калькуляторе сделать запрет ввода числа, через кеу не получается.вот полный код #include &quot;stdafx.h&quot; #include...

Запрет ввода только минуса в ячейке StringGrid, и запрет на ввод минуса между цифрами
Ребята,очень нужна ваша помощь!Нужно сделать запрет ввода ТОЛЬКО минуса в ячейке и запрет на ввод минуса между цифрами, чтобы не получилось...

Ввод только определенных символов, удаление запрещенных символов из ячейки ввода
Добрый вечер! Подскажите, пожалуйста, как можно такое реализовать посредством jQuery. Вот форма: &lt;div id=&quot;comment&quot;&gt; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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