Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » С++. Как ограничить ввод символов.

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Taran2ul



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте гуру С++!!!
Есть программа. Рассчитывает кол-во часов во введенном году.
Требуется запретить ввод (или обработку) символов в поле года, кроме цифр.
А то при вводе буквы, программа начинает конвульсивно что-то выводить на экран.
 
P.S Скажите как в VS 6.0 включить поддержку кириллицы. Дома VS 2010 и работает с  "setlocale( LC_ALL, "Russian" );", а в VS 6.0 не хочет.
 

Код:
 
//
// Программа для расчета
// количества часов в году
//
#include <stdio.h>
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
    setlocale( LC_ALL, "Russian" );
    char s;
    int Year; // Введите год
    do{
    cout << "Введите год: ";
    //cout << "Enter year: ";
    cin >> Year;
 
    int DayInYear; //Количество дней в году
    if (Year % 4==0)
    {
        DayInYear = 366;
    }
    else
    {
        DayInYear = 365;
    }
    
    const int HourInDay = 24;
 
    int HourInYear;
    HourInYear = DayInYear * HourInDay;
        
    // Вывод результатов
    cout << "В "<<Year <<" году: ";
    //cout << "In "<<Year <<" year: ";
    cout << HourInYear <<" часов.\n";
    //cout << HourInYear <<" hours.\n";
    cout << "Введите \"X\" для выхода!\n";
    //cout << "Enter \"X\" to exit!\n";
    cin >>s;
    }while(s!='x' && s!='X');
    
    return 0;
}
 

Всего записей: 458 | Зарегистр. 18-02-2008 | Отправлено: 22:46 17-01-2011 | Исправлено: Taran2ul, 01:57 18-01-2011
ItsJustMe

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно с этим и в эту тему.
1. Используй sscanf[_s]. Точно укажешь, что из ввода брать.
2. А зачем тебе вообще setlocale? Или у тебе в консоли не cp866 (локаль в Windows отлична от русской)?

Всего записей: 2028 | Зарегистр. 02-09-2005 | Отправлено: 02:01 18-01-2011
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
A что за "поле года"? в чем оно конкретно сидит? А то - Edit Control, стиль ES_NUMBER

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 09:16 18-01-2011
Taran2ul



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ребят я в с++ первую неделю.
ItsJustMe

Цитата:
1. Используй sscanf[_s]. Точно укажешь, что из ввода брать.

Это как? Ну для случая если, там куда вводим год, можно было ввести только цифры.  

Цитата:
2. А зачем тебе вообще setlocale? Или у тебе в консоли не cp866 (локаль в Windows отлична от русской)?

Ну если этой строки нет, то в консоли кракозябры.
 
XPEHOMETP

Цитата:
A что за "поле года"?

Может я некорректно выразился. "поле года" - это строка в консоли куда мы вводим год для дальнейшего расчета.

Всего записей: 458 | Зарегистр. 18-02-2008 | Отправлено: 14:12 18-01-2011 | Исправлено: Taran2ul, 14:45 18-01-2011
Alexand



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если хочешь запретить ввод, то можно использовать функцию _getch() и проверять что пользователь вводит. Например вот так:

Код:
 
    int c;
    int year = 0;
    
    while ( (c = _getch()) != '\r' && c != '\n' )
    {
        if (c >= '0' && c <= '9')
        {
            year = year*10+c-'0';
            cout << char(c);
        }
    }
 

Для работы функции _getch() должна быть включена библиотека <conio.h>.

Всего записей: 105 | Зарегистр. 12-03-2003 | Отправлено: 15:50 18-01-2011
Taran2ul



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alexand
Исправил и вставил после

Код:
 
...
cin >> Year;
int c;  
    //int Year = 0;  
     
    while ( (c = _getch()) != '\r' && c != '\n' )  
    {  
        if (c >= '0' && c <= '9')  
        {  
            Year = Year*10+c-'0';  
            cout << char(c);  
        }  
    }
...
 

 
Запускаем программу и вводим год, нажимаем Enter
Перескакивает на новую строку ! Почему? Еще раз Enter
Выводит кол. часов в году. Вроде правильно.
Вводим любой символ или цифру.
Получаем запрос "Введите год". Все правильно.
Теперь самое интересное. Если вместо года ввести букву, то прога сходит с ума.

Всего записей: 458 | Зарегистр. 18-02-2008 | Отправлено: 00:06 19-01-2011
Alexand



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Taran2ul
Тот цикл, что я написал, он посимвольно считывает все то что вводит пользователь и отбрасывает все не-цифры. А у вас вышло, что вначале значение года программа считывает при помощи объекта "cin", а затем при помощи "_getch()";

Всего записей: 105 | Зарегистр. 12-03-2003 | Отправлено: 02:16 19-01-2011
ItsJustMe

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Это как? Ну для случая если, там куда вводим год, можно было ввести только цифры.

Это так.
Совсем конкретно:

Код:
  int d;
  _tprintf_s(_T("enter a year: "));
  if (_tscanf_s(_T("%d"), &d) == 1)
    _tprintf_s(_T("you have entered: %d\n"), d);
  else
    _tprintf_s(_T("You have entered no suitable numeric value.\n"), d);

Всего записей: 2028 | Зарегистр. 02-09-2005 | Отправлено: 03:03 19-01-2011 | Исправлено: ItsJustMe, 00:57 01-02-2011
Taran2ul



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ItsJustMe
вставил ваш код но отладчик говорит:
 
"IntelliSense: аргумент типа "int *" несовместим с параметром типа "const wchar_t *"
 
Что не так?
 
Добавлено:
Alexand
А как правильно? "cin >> c"

Всего записей: 458 | Зарегистр. 18-02-2008 | Отправлено: 13:57 24-01-2011
ItsJustMe

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот так вот писать по памяти... Буква s лишняя. Исправил предыдущий пост.
 
Добавлено:
Да и вообще я решил скомпайлить свой пример.... В результате чего всплыли еще недоработки. Исправлено. С unicode в консоли есть сложности. Я уже и подзабыл это - вечно пишу на английском все сообщения, вот и не сталкиваюсь часто с этими траблами.

Всего записей: 2028 | Зарегистр. 02-09-2005 | Отправлено: 00:50 01-02-2011
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » С++. Как ограничить ввод символов.


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru