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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.79
Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 56
#1

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

19.05.2011, 16:39. Просмотров 5586. Ответов 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. Заранее благодарю.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2011, 16:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ввод в консоле только чисел(запрет ввода других символов) (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
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
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 56
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
150 / 148 / 21
Регистрация: 09.02.2010
Сообщений: 407
22.05.2011, 14:49 #19
Hotbed, забыл очистить память
C++
1
delete[] A;
Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 56
22.05.2011, 15:50  [ТС] #20
Цитата Сообщение от dampir_sanek Посмотреть сообщение
Hotbed, забыл очистить память
C++
1
delete[] A;
Да не только забыл очистить, но и не к чему (в 12 строчке) было выделять под размерность в массиве С[k] константное значение надо было выделить памяти ровно на один символ... Да спасибо проглядел.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
22.05.2011, 15:58 #21
Hotbed, И вот на кой здесь юзать define...
Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 56
22.05.2011, 16:07  [ТС] #22
ForEveR,
А чем это отличается # define k 80 от const int k=80 ; ? Тем что здесь 1 это С а 2 это с++
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
22.05.2011, 16:40 #23
Hotbed, Тем что первое это макрос. У него нет типа. Он не знает о простраствах имен. И прочие плохие вещи. А второе - константа определенного типа.
Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 56
22.05.2011, 16:55  [ТС] #24
ForEveR, А как допустим задать константу (при необходимости ее использования в Си ) не используя #define ? Конечно делаю больший уклон при изучении на C++, но все таки надо знать ведь Си основа С++. И при учебе в ВУЗе (в будущем) может пригодится знание синтаксиса Си
А почему о using namespace
Он не знает о простраствах имен. И прочие плохие вещи.
Вы отзываетесь так? Чем плохо его использование? При написании кода Вы его я заметил не используете почему?
Kastaneda
Форумчанин
Эксперт С++
4518 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,267
Записей в блоге: 2
Завершенные тесты: 1
22.05.2011, 17:01 #25
Цитата Сообщение от Hotbed Посмотреть сообщение
А как допустим задать константу (при необходимости ее использования в Си ) не используя #define ?
Есть такая вещь, называется "финт с перечислением" (даже есть аналогичный английский термин).
C
1
2
enum{myconstant=10};
int arrray[myconstant];
По одному из источников он (финт) родился когда в классах еще нельзя было использовать статичные константы, и программеры придумали такой вот хитрый ход))
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
22.05.2011, 17:02 #26
Hotbed, Я просто не люблю явное использование using namespace. Хотя иногда использую. Но не std.

А #define пофигу на пространства имен. Абсолютно.
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
22.05.2011, 22:29 #27
Hotbed, пространства имен придумали, не для того что бы программисту надо было каждый раз писать using namespace, да еще и глобально.

Добавлено через 1 минуту
#define это жуть полнейшая, которая портит весь язык c++, но от которой никуда пока не деться. Будем надеяться на стандарт 2x.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2011, 22:29
Привет! Вот еще темы с ответами:

Запрет на ввод чисел в строку - C++
Как можно сделать посимвольный ввод строки, что бы каждый символ можно было проверять на принадлежность к числу и если это не число, то не...

В одномерном массиве подсчитать количество положительных чисел, отрицательных чисел и других символов - C++
В одномерном массиве подсчитать количество положительных чисел, отрицательных чисел и других символов. Значения элементов массива вводятся...

Скрыть ввод в консоле ввод записи? - C++
Здравствуйте. Подскажите пожалуйста, как реализовать я ввожу строку к примеру Yjdro2, а выводило на экран как ******?

Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов - C++
Привет всем! Вот пишу программу, преподаватель сказал чтобы написал защиту от ввода чисел с плавающей точкой, отрицательных, символов. В...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.05.2011, 22:29
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru