Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.79
Hotbed
 Аватар для Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 55
19.05.2011, 16:39     Ввод в консоле только чисел(запрет ввода других символов) #1
В консольном варианте с предложением пользователю ввести фразу, содержащую и цифры и буквы, чтоб потом программа после ввода исключала буквы и выводила строку состоящую только из чисел

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


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. Заранее благодарю.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
19.05.2011, 17:07     Ввод в консоле только чисел(запрет ввода других символов) #2
Цитата Сообщение от Hotbed Посмотреть сообщение
И второй вопрос как сделать так чтобы при вводе пользыватель не смог вводить буквы и другие символы.Слышал это можно реализовать по средствам функции getch.
ИМХО: getch() нестандартная ф-ция, поэтому нежелательно ее юзать (я ее вообще не использую).
Вот, посмотри, там то, что тебе нужно средствами WinAPI. Там правда совсем сырой код, но суть должна быть понятна.
dampir_sanek
149 / 147 / 21
Регистрация: 09.02.2010
Сообщений: 407
19.05.2011, 17:37     Ввод в консоле только чисел(запрет ввода других символов) #3
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;
}
Hotbed
 Аватар для Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 55
19.05.2011, 17:54  [ТС]     Ввод в консоле только чисел(запрет ввода других символов) #4
Спасибо Kastaneda, только сложновато для моего уровня, но ведь трудности это хорошо, буду изучать дескрипторы консоли и Ваш код а потом попробую разобраться почему Вы его назвали "сырым".

dampir_sanek Спасибо давно искал пример на fgets с такой потребностью как у меня. Буду разбиратся с кодом, если что задам вопрос.
dampir_sanek
149 / 147 / 21
Регистрация: 09.02.2010
Сообщений: 407
19.05.2011, 17:56     Ввод в консоле только чисел(запрет ввода других символов) #5
Переработал фунцию 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;
}
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
19.05.2011, 17:57     Ввод в консоле только чисел(запрет ввода других символов) #6
Цитата Сообщение от Hotbed Посмотреть сообщение
Спасибо Kastaneda, только сложновато для моего уровня, но ведь трудности это хорошо, буду изучать дескрипторы консоли и Ваш код а потом попробую разобраться почему Вы его назвали "сырым".
Вот в помощь. Там все, что нужно знать для работы с консолью Windows.
Hotbed
 Аватар для Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 55
19.05.2011, 19:25  [ТС]     Ввод в консоле только чисел(запрет ввода других символов) #7
Цитата Сообщение от dampir_sanek Посмотреть сообщение
Переработал фунцию remove_alpha, ей не нужен параметр n:
Не большая ошибочка в строчке t[j++] = t[i++]; ---------> t[j++] = t[i];
Вопрос такой почему функция remove_alpha ни чего не возвращает (Void) ?
dampir_sanek
149 / 147 / 21
Регистрация: 09.02.2010
Сообщений: 407
19.05.2011, 20:47     Ввод в консоле только чисел(запрет ввода других символов) #8
Hotbed, ага, правильно ошибку поправил. Потому что передается указатель на область памяти, и соответсвенно изменяется переданный массив, а не его копия. Поэтому возвращать ничего и не нужно.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
20.05.2011, 10:43     Ввод в консоле только чисел(запрет ввода других символов) #9
Цитата Сообщение от Hotbed Посмотреть сообщение
как сделать так чтобы при вводе пользователь не смог вводить буквы и другие символы
Если можно пользоваться сторонними библиотеками, то могу одну посоветовать.
Hotbed
 Аватар для Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 55
20.05.2011, 10:55  [ТС]     Ввод в консоле только чисел(запрет ввода других символов) #10
Цитата Сообщение от gooseim Посмотреть сообщение
Если можно пользоваться сторонними библиотеками, то могу одну посоветовать.
Все методы будут интересны для меня новичка. Я так понял что сторонние библиотеки не всегда хорошо сказываются на безопасности программы. Расскажите о недостатке предложенного в будущем коде.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.05.2011, 13:52     Ввод в консоле только чисел(запрет ввода других символов) #11
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';
}
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
20.05.2011, 14:05     Ввод в консоле только чисел(запрет ввода других символов) #12
Все методы будут интересны для меня новичка. Я так понял что сторонние библиотеки не всегда хорошо сказываются на безопасности программы. Расскажите о недостатке предложенного в будущем коде.
Не понял. Рассказать о недостатке чего и в каком коде.
Hotbed
 Аватар для Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 55
20.05.2011, 14:33  [ТС]     Ввод в консоле только чисел(запрет ввода других символов) #13
Цитата Сообщение от gooseim Посмотреть сообщение
Не понял. Рассказать о недостатке чего и в каком коде.
Я про Ваше предложение
то могу одну посоветовать
и
и в каком коде.
В моем будущем коде с применением Вашего совета.
о недостатке чего
сторонней библиотеке
Например есть функция gets но не безопасна альтернатива безопасная fgets
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
20.05.2011, 14:36     Ввод в консоле только чисел(запрет ввода других символов) #14
Ок. Вечером покажу, сейчас у меня нет ее с собой.
Hotbed
 Аватар для Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 55
20.05.2011, 18:29  [ТС]     Ввод в консоле только чисел(запрет ввода других символов) #15
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() являются интераторами? И как они работают, точнее на что указывают при работе?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.05.2011, 19:51     Ввод в консоле только чисел(запрет ввода других символов) #16
Hotbed, string::erase() функция класса. У нее есть перегруженные версии. Подробнее в гугле.
В данном случае используется версия от двух итераторов. Суть : удаляем из контейнера диапазон начиная от начального итератора, заканчивая конечным (не включая).

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

string::begin(), string::end() - функции. Возвращают итератор на первый элемент и на элемент следующий за последним соответственно.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
20.05.2011, 22:50     Ввод в консоле только чисел(запрет ввода других символов) #17
Вот пример кода, использующий байду, о кот. я говорил:
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, но ими слишком сложно пользоваться.
Hotbed
 Аватар для Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 55
22.05.2011, 10:42  [ТС]     Ввод в консоле только чисел(запрет ввода других символов) #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
# 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");
}
dampir_sanek
149 / 147 / 21
Регистрация: 09.02.2010
Сообщений: 407
22.05.2011, 14:49     Ввод в консоле только чисел(запрет ввода других символов) #19
Hotbed, забыл очистить память
C++
1
delete[] A;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2011, 15:50     Ввод в консоле только чисел(запрет ввода других символов)
Еще ссылки по теме:

C++ Проверка правильности ввода. Запретить ввод чисел
C++ Скрыть ввод в консоле ввод записи?
C++ Запрет ввода символов, отличных от цифр

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

Или воспользуйтесь поиском по форуму:
Hotbed
 Аватар для Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 55
22.05.2011, 15:50  [ТС]     Ввод в консоле только чисел(запрет ввода других символов) #20
Цитата Сообщение от dampir_sanek Посмотреть сообщение
Hotbed, забыл очистить память
C++
1
delete[] A;
Да не только забыл очистить, но и не к чему (в 12 строчке) было выделять под размерность в массиве С[k] константное значение надо было выделить памяти ровно на один символ... Да спасибо проглядел.
Yandex
Объявления
22.05.2011, 15:50     Ввод в консоле только чисел(запрет ввода других символов)
Ответ Создать тему
Опции темы

Текущее время: 18:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru