С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

19.05.2011, 16:39. Просмотров 5995. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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; ...

26
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,387
Записей в блоге: 2
Завершенные тесты: 1
19.05.2011, 17:07 #2
Цитата Сообщение от Hotbed Посмотреть сообщение
И второй вопрос как сделать так чтобы при вводе пользыватель не смог вводить буквы и другие символы.Слышал это можно реализовать по средствам функции getch.
ИМХО: getch() нестандартная ф-ция, поэтому нежелательно ее юзать (я ее вообще не использую).
Вот, посмотри, там то, что тебе нужно средствами WinAPI. Там правда совсем сырой код, но суть должна быть понятна.
1
dampir_sanek
150 / 148 / 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;
}
1
Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 56
19.05.2011, 17:54  [ТС] #4
Спасибо Kastaneda, только сложновато для моего уровня, но ведь трудности это хорошо, буду изучать дескрипторы консоли и Ваш код а потом попробую разобраться почему Вы его назвали "сырым".

dampir_sanek Спасибо давно искал пример на fgets с такой потребностью как у меня. Буду разбиратся с кодом, если что задам вопрос.
0
dampir_sanek
150 / 148 / 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;
}
1
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,387
Записей в блоге: 2
Завершенные тесты: 1
19.05.2011, 17:57 #6
Цитата Сообщение от Hotbed Посмотреть сообщение
Спасибо Kastaneda, только сложновато для моего уровня, но ведь трудности это хорошо, буду изучать дескрипторы консоли и Ваш код а потом попробую разобраться почему Вы его назвали "сырым".
Вот в помощь. Там все, что нужно знать для работы с консолью Windows.
1
Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 56
19.05.2011, 19:25  [ТС] #7
Цитата Сообщение от dampir_sanek Посмотреть сообщение
Переработал фунцию remove_alpha, ей не нужен параметр n:
Не большая ошибочка в строчке t[j++] = t[i++]; ---------> t[j++] = t[i];
Вопрос такой почему функция remove_alpha ни чего не возвращает (Void) ?
0
dampir_sanek
150 / 148 / 21
Регистрация: 09.02.2010
Сообщений: 407
19.05.2011, 20:47 #8
Hotbed, ага, правильно ошибку поправил. Потому что передается указатель на область памяти, и соответсвенно изменяется переданный массив, а не его копия. Поэтому возвращать ничего и не нужно.
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
20.05.2011, 10:43 #9
Цитата Сообщение от Hotbed Посмотреть сообщение
как сделать так чтобы при вводе пользователь не смог вводить буквы и другие символы
Если можно пользоваться сторонними библиотеками, то могу одну посоветовать.
0
Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 56
20.05.2011, 10:55  [ТС] #10
Цитата Сообщение от gooseim Посмотреть сообщение
Если можно пользоваться сторонними библиотеками, то могу одну посоветовать.
Все методы будут интересны для меня новичка. Я так понял что сторонние библиотеки не всегда хорошо сказываются на безопасности программы. Расскажите о недостатке предложенного в будущем коде.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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';
}
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
20.05.2011, 14:05 #12
Все методы будут интересны для меня новичка. Я так понял что сторонние библиотеки не всегда хорошо сказываются на безопасности программы. Расскажите о недостатке предложенного в будущем коде.
Не понял. Рассказать о недостатке чего и в каком коде.
0
Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 56
20.05.2011, 14:33  [ТС] #13
Цитата Сообщение от gooseim Посмотреть сообщение
Не понял. Рассказать о недостатке чего и в каком коде.
Я про Ваше предложение
то могу одну посоветовать
и
и в каком коде.
В моем будущем коде с применением Вашего совета.
о недостатке чего
сторонней библиотеке
Например есть функция gets но не безопасна альтернатива безопасная fgets
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
20.05.2011, 14:36 #14
Ок. Вечером покажу, сейчас у меня нет ее с собой.
0
Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 56
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() являются интераторами? И как они работают, точнее на что указывают при работе?
0
20.05.2011, 18:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2011, 18:29
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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