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

Как лучше поставить ограничение на ввод букв, и знаков перпинания - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
letnjaja
 Аватар для letnjaja
53 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 200
01.11.2012, 01:43     Как лучше поставить ограничение на ввод букв, и знаков перпинания #1
Добрый вечер!
подскажите, как лучше поставить ограничение на ввод букв, и знаков перпинания (,.! ,пробел и других, которые используют в предложениях) ?
C++
1
2
3
4
5
cout<<"enter a text-line:"<<endl;
cin.get();
cin.getline(input, 100);
cout<<"You entered"<<" \" "<<input<<" \" "<<endl;
cout<<endl;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.11.2012, 02:44     Как лучше поставить ограничение на ввод букв, и знаков перпинания #2
Поясните, в чём ограничение? Не вводить что?

Добавлено через 19 минут
Если задача в том, чтобы только цифры принимать, то, как вариант, посимвольный ввод (или посимвольный анализ введённого) и использование функций из библиотеки cctype. Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream> 
#include <string>
#include <cctype> 
using namespace std; 
 
int main () 
 { 
 string str;
 char ch;
 while (true)
 { 
    cin.get(ch);
    if (!cin) break;
    if (isdigit((unsigned char)ch)) str.push_back(ch);
 }
 
 cout << str << endl;
 
 cin.clear();
 cin.get();
 return 0;
}
Миниатюры
Как лучше поставить ограничение на ввод букв, и знаков перпинания  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.11.2012, 02:51     Как лучше поставить ограничение на ввод букв, и знаков перпинания #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream> 
#include <string>
#include <cctype> 
using namespace std; 
 
int main () 
 { 
 string str;
 char ch;
 while (true)
 { 
    cin.get(ch);
    if (ch == '\n') break;
    if (isdigit((unsigned char)ch)) str.push_back(ch);
 }
 
 cout << str << endl;
 
 cin.clear();
 cin.get();
 return 0;
}
Миниатюры
Как лучше поставить ограничение на ввод букв, и знаков перпинания  
letnjaja
 Аватар для letnjaja
53 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 200
01.11.2012, 16:30  [ТС]     Как лучше поставить ограничение на ввод букв, и знаков перпинания #4
принимать буквы,точку, запятую, восклицательный и вопросительный знаки, и т.д.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.11.2012, 18:12     Как лучше поставить ограничение на ввод букв, и знаков перпинания #5
Что не принимать?
letnjaja
 Аватар для letnjaja
53 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 200
01.11.2012, 18:51  [ТС]     Как лучше поставить ограничение на ввод букв, и знаков перпинания #6
не принимать цифры
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.11.2012, 19:09     Как лучше поставить ограничение на ввод букв, и знаков перпинания #7
C++
1
if (!isdigit((unsigned char)ch)) str.push_back(ch);
Миниатюры
Как лучше поставить ограничение на ввод букв, и знаков перпинания  
letnjaja
 Аватар для letnjaja
53 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 200
02.11.2012, 01:36  [ТС]     Как лучше поставить ограничение на ввод букв, и знаков перпинания #8
а можно такой же прием использовать, в этом случае
я запрашиваю ввести два числа
но если скажем вводят 4711
3.14159265 messing up
, у меня выводится сообщение об ошибке
как сделать, чтобы все работало как сейчас, но все остальное(лишнее), что вводится просто игнорилось и не выводило сообщение об ошибке?
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
while(true)
{
cout<<"enter one integer and one real number:"<<endl;
cin>>number6;
cin>>real;
if( cin.good())
    {
              //cout<<"The real number is:"<<endl;
        
              std::cout<<std::fixed<<std::setprecision(3)<<real<<endl;
              
              stringstream ss2;//potok dlja strok
               ss2 << real; //  v potok 4islo
               string str2;
               ss2>> str2; // iz potoka stroka
               //cout <<"size of real:"<< (str2.size()+4) << endl; //vivod koli4estva simvolov v stroke
               cout<<"The real number is:";
               for (int i=0;i<(str2.size()+4);i++){
                   
               cout<<" ";
               }
              ;
              
               cout<<real;
              // cout<<endl;
              
                                         //cout<<"The integer is:"<<number6<<endl;
                                         cout<<endl;
                                         stringstream s3;//potok dlja strok
               
               s3 << number6; //  
               string str3;
               s3 >> str3; // 
               //cout <<"size of int:"<< str3.size() << endl; 
               cout<<"The integer is:";
               for (int i=0;i<str3.size();i++){
               cout<<" ";}
               cout<<number6;
               cout<<endl;
               cin.ignore(10, '\n');
                   break;
     }
     cin.clear();
     cout << "nepraviljnij vvod " << endl;
     cin.ignore(10, '\n');
     }
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.11.2012, 03:44     Как лучше поставить ограничение на ввод букв, и знаков перпинания #9
Цитата Сообщение от letnjaja Посмотреть сообщение
но все остальное(лишнее), что вводится просто игнорилось и не выводило сообщение об ошибке?
Делайте ввод не через cin>>. Код в 3 посте. Получите строку цифр (дальше вы всё равно число в строку переводите). Только подумайте насчёт отрицательных чисел (если предполагается, что они будут вводиться). Поток ss2 минус перед числом (или плюс) корректно обработает. Нужно только в коде, из 3 поста, дополнительную проверку сделать на минус перед первой цифрой (если первый символ перед цифрой минус, то поместить в строку).


Кликните здесь для просмотра всего текста
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <iomanip>
using namespace std;
 
int main()
{ 
setlocale (LC_ALL,"Russian");
    
while(true)
{
cout<<"enter one integer and one real number:"<<endl;
string number6;
char ch;
 
while (true)
{ 
    cin.get(ch);
    if (ch == '\n') break;
    if (ch == '-' && number6.empty() && isdigit((unsigned char)cin.peek()))
         number6.push_back(ch);
    else if (isdigit((unsigned char)ch)) number6.push_back(ch);
    
}
cin.clear();
 
cout << number6 << endl;
//cin>>number6;
 
string real;
while (true)
{ 
    cin.get(ch);
    if (ch == '\n') break;
    if (ch == '-' && real.empty() && isdigit((unsigned char)cin.peek()))
         real.push_back(ch);
    else if (isdigit((unsigned char)ch)) real.push_back(ch);
}
cin.clear();
 
cout << real << endl;
//cin>>real;
 
    
    //cout<<"The real number is:"<<endl;
        
    //std::cout << std::fixed << std::setprecision(3) << real << endl;
              
    //stringstream ss2;//potok dlja strok
    //ss2 << real; //  v potok 4islo
    //string str2;
    //ss2 >> str2; // iz potoka stroka
    //cout <<"size of real:"<< (str2.size()+4) << endl; //vivod koli4estva simvolov v stroke
    cout<<"The real number is:";
    for (int i = 0; i < (/*str2*/real.size() + 4); i++)
            cout<<" ";
    
    cout << real;
    //cout<<endl;
              
    //cout<<"The integer is:"<<number6<<endl;
    cout << endl;
    //stringstream s3;//potok dlja strok
               
    //s3 << number6; //  
    //string str3;
    //s3 >> str3; // 
    //cout <<"size of int:"<< str3.size() << endl; 
    cout << "The integer is:";
    for (int i = 0; i < /*str3*/number6.size(); i++)
            cout<<" ";
    
    cout << number6;
    cout << endl << endl;
    //cin.ignore(10, '\n');
    break;
     
     //cin.clear();
     //cout << "nepraviljnij vvod " << endl;
     //cin.ignore(10, '\n');
 }
   
   
  system("PAUSE");
  return EXIT_SUCCESS;
}
letnjaja
 Аватар для letnjaja
53 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 200
02.11.2012, 04:07  [ТС]     Как лучше поставить ограничение на ввод букв, и знаков перпинания #10
че-то ничего не видно мне из- за цитаты. тоесть я имею ввиду такую ситуацию, я запрашиваю 2 числа (целое и реальное), а вводят через пробел целое. реальное и еще какое-то слово. и тогда выдается сообщение об ошибке. а я хочу сделать, чтобы слово считали, но проигнорировали и в you entered его не было, а вывели только 2 числа и без errorov.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.11.2012, 04:29     Как лучше поставить ограничение на ввод букв, и знаков перпинания #11
Цитата Сообщение от letnjaja Посмотреть сообщение
че-то ничего не видно мне из- за цитаты
Что не видно?

Добавлено через 2 минуты
Цитата Сообщение от letnjaja Посмотреть сообщение
тоесть я имею ввиду такую ситуацию, я запрашиваю 2 числа (целое и реальное), а вводят через пробел целое. реальное и еще какое-то слово. и тогда выдается сообщение об ошибке. а я хочу сделать, чтобы слово считали, но проигнорировали и в you entered его не было, а вывели только 2 числа и без errorov.
9 пост.

Добавлено через 2 минуты
Зачем вам ввод чисел, если потом переводите их в строки? Читайте сразу в строки. Если строки через пробел, то cin >> считает две строки, то что после второй строки оставит в потоке (пред следующим вводом нужно очистить), ошибки не выдаст:
C++
1
2
3
4
5
6
7
string str1, str2;
cin >> str1 >> str2;
 
cout << str1 << endl << str2 << endl;
 
cin.clear();
while (cin.get() != '\n');
Добавлено через 5 минут
В общем, код зависит от предполагаемого формата ввода.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2012, 17:28     Как лучше поставить ограничение на ввод букв, и знаков перпинания
Еще ссылки по теме:

C++ Последовательность из цифр, букв и знаков. Подсчитать чего больше и составить строки только из цифр, букв и знаков
C++ Подскажите, как добавить проверку на ввод букв? код внутри
Можете объяснить, как работает следующая проверка (на ввод букв)? C++

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

Или воспользуйтесь поиском по форуму:
letnjaja
 Аватар для letnjaja
53 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 200
02.11.2012, 17:28  [ТС]     Как лучше поставить ограничение на ввод букв, и знаков перпинания #12
спасибо, теперь слово игнорит и все отлично, но появилась другая проблема
C++
1
std::cout<<std::fixed<<std::setprecision(3)<<real<<endl;
мне надо как-то по другому задать эту точность для реального числа, но теперь я не знаю как это реально сделать, если я вывожу str

пример:
Enter one integer and one real number: 4711
3.14159265 messing up
The real is: 3.142
The integer is: 4711

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
47
48
49
50
51
52
//enter one integer and one real number
while(true)
{
cout<<"enter one integer and one real number:"<<endl;
cin>>number6;
cin>>real;
if( cin.good())
    {
              //cout<<"The real number is:"<<endl;
        
              //std::cout<<std::fixed<<std::setprecision(3)<<real<<endl;
              
              stringstream ss2;//potok dlja strok
               ss2 << real; //  v potok 4islo
               string str2;
               ss2>> str2; // iz potoka stroka
               //cout <<"size of real:"<< (str2.size()+4) << endl; //vivod koli4estva simvolov v stroke
               cout<<"The real number is:";
               for (int i=0;i<(str2.size()+4);i++){
                   
               cout<<" ";
               }
              ;
              cout<<str2;
               //cout<<real;
              // cout<<endl;
              
                                         //cout<<"The integer is:"<<number6<<endl;
                                         cout<<endl;
                                         stringstream s3;//potok dlja strok
               
               s3 << number6; //  
               string str3;
               s3 >> str3; // 
               //cout <<"size of int:"<< str3.size() << endl; 
               cout<<"The integer is:";
               for (int i=0;i<str3.size();i++){
               cout<<" ";}
               cout<<str3;
               //cout<<number6;
               cout<<endl;
              // cout << str2 << endl << str2 << endl;
 
               cin.clear();
               while (cin.get() != '\n');
               cin.ignore(10, '\n');
                   break;
     }
     cin.clear();
     cout << "nepraviljnij vvod " << endl;
     cin.ignore(10, '\n');
     }
Миниатюры
Как лучше поставить ограничение на ввод букв, и знаков перпинания  
Yandex
Объявления
02.11.2012, 17:28     Как лучше поставить ограничение на ввод букв, и знаков перпинания
Ответ Создать тему
Опции темы

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