Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» С++. Как ограничить ввод символов.

Автор: Taran2ul
Дата сообщения: 17.01.2011 21:46
Здравствуйте гуру С++!!!
Есть программа. Рассчитывает кол-во часов во введенном году.
Требуется запретить ввод (или обработку) символов в поле года, кроме цифр.
А то при вводе буквы, программа начинает конвульсивно что-то выводить на экран.

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;
}
Автор: ItsJustMe
Дата сообщения: 18.01.2011 01:01
Можно с этим и в эту тему.
1. Используй sscanf[no][[/no]_s[no]][/no]. Точно укажешь, что из ввода брать.
2. А зачем тебе вообще setlocale? Или у тебе в консоли не cp866 (локаль в Windows отлична от русской)?
Автор: XPEHOMETP
Дата сообщения: 18.01.2011 08:16
A что за "поле года"? в чем оно конкретно сидит? А то - Edit Control, стиль ES_NUMBER
Автор: Taran2ul
Дата сообщения: 18.01.2011 13:12
Ребят я в с++ первую неделю.
ItsJustMe

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

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

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

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

XPEHOMETP

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

Может я некорректно выразился. "поле года" - это строка в консоли куда мы вводим год для дальнейшего расчета.
Автор: Alexand
Дата сообщения: 18.01.2011 14:50
Если хочешь запретить ввод, то можно использовать функцию _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);
        }
    }
Автор: Taran2ul
Дата сообщения: 18.01.2011 23:06
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);
}
}
...
Автор: Alexand
Дата сообщения: 19.01.2011 01:16
Taran2ul
Тот цикл, что я написал, он посимвольно считывает все то что вводит пользователь и отбрасывает все не-цифры. А у вас вышло, что вначале значение года программа считывает при помощи объекта "cin", а затем при помощи "_getch()";
Автор: ItsJustMe
Дата сообщения: 19.01.2011 02:03

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

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

Код: 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);
Автор: Taran2ul
Дата сообщения: 24.01.2011 12:57
ItsJustMe
вставил ваш код но отладчик говорит:

"IntelliSense: аргумент типа "int *" несовместим с параметром типа "const wchar_t *"

Что не так?

Добавлено:
Alexand
А как правильно? "cin >> c"
Автор: ItsJustMe
Дата сообщения: 31.01.2011 23:50
Вот так вот писать по памяти... Буква s лишняя. Исправил предыдущий пост.

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

Страницы: 1

Предыдущая тема: Несколько вопросов по сетевому программированию на С++ (азы)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.