Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2013, 23:00   #1
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию Символ в int

Доброго времени суток. В любой написанной мною программе, где присутствует тип данных int, при вводе в последний чего угодно, кроме числа, программа тут же начинает некорректно себя вести. Хотелось бы спросить, можно ли как то сделать проверку, чтобы пользователь не мог переменной типа int присвоить букву или символ.
P.S. программированием занимаюсь не так давно, так что был бы благодарен за код с комментариями
Dima-War вне форума Ответить с цитированием
Старый 08.04.2013, 23:15   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
В любой написанной мною программе, где присутствует тип данных int, при вводе в последний чего угодно, кроме числа, программа тут же начинает некорректно себя вести.
А какое поведение Вы считаете корректным в таком случае? То есть, если пользователь вместо числа упорно вводит рецепт сливового пирога своей бабушки, какая величина должна быть записана в целочисленную переменную и как должна повести себя программа?

Если что, функция scanf() возвращает число успешно прочитанных переменных, а с потоком ввода (скажем, std::cin) можно поступить вот так.
Abstraction вне форума Ответить с цитированием
Старый 08.04.2013, 23:19   #3
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
А какое поведение Вы считаете корректным в таком случае?
Ну, например, если я использую цикл и случайно ввожу в переменную букву, то цикл, а далее и сама программа завершатся. Вот пример.
Код:
#include <iostream>

using namespace std;

int main()
{
	int a = 0;
	for(;;)
	{
		cin >> a;
	}
	system("pause");
	return 0;
}
Если ввести букву, то последующий ввод каких либо значений в переменную будет невозможен.
Dima-War вне форума Ответить с цитированием
Старый 09.04.2013, 10:58   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Во-первых, в Вашем примере программа не завершится никогда.
Во-вторых, Вы смотрели код по ссылке из моего предыдущего сообщения?
Код:
if ((std::cout << "Enter some number ") && !(std::cin >> a)) {
    std::cout << "That's not a number; ";
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
} else {
    std::cout << "You entered " << a << std::endl;
}
Abstraction вне форума Ответить с цитированием
Старый 09.04.2013, 12:21   #5
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
Код:
system("pause");

Пожалуйста, никогда так не делайте. Не знаю как это работает на виндовсе, а на юниксах это ставит на паузу весь вывод в консоль (в том числе от других программ).
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 09.04.2013, 22:46   #6
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Во-первых, в Вашем примере программа не завершится никогда.
Во-вторых, Вы смотрели код по ссылке из моего предыдущего сообщения?
Ну пример я привел просто, чтобы показать, что я имею ввиду под некорректной работой программы. А по поводу примера, не совсем понимаю, что там написано Если конкретно, то никогда не встречал cin.clear(), cin.ingore() и numeric_limits. Может есть вариант попроще?


Цитата:
Сообщение от ROD Посмотреть сообщение
Пожалуйста, никогда так не делайте. Не знаю как это работает на виндовсе, а на юниксах это ставит на паузу весь вывод в консоль (в том числе от других программ).
Раньше использовал _getch(), но мне сказали, что программы, которые используют conio.h нельзя перенести на линукс и посоветовали тот самый system("pause"). Есть ли другие варианты?
Dima-War вне форума Ответить с цитированием
Старый 09.04.2013, 23:21   #7
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

ммм точно не помню, но вроде бы std::getc(); Надо стандарт почитать будет.

upd.

Не помню, можно-ли использоваться std::без переменной. Вроде бы нет.

А так можно было бы
Код:
int a; //просто что бы была переменная
std::cin>>a;
или еще вариант std::cin.get();
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 09.04.2013 в 23:29.
ROD вне форума Ответить с цитированием
Старый 09.04.2013, 23:28   #8
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Цитата:
Сообщение от ROD Посмотреть сообщение
Код:
int a; //просто что бы была переменная
std::cin<<a;
Ну это не эстетично что-ли :D
Dima-War вне форума Ответить с цитированием
Старый 09.04.2013, 23:37   #9
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

К стати, по поводу ввода строки в int случайно наткнулся на такой пример (не проверял):

Код:

int number;
    do{
        cin >> number;
        if(cin.fail())
            cout << "Not a number " << endl;
    }while(!cin.fail());
    cout << "number is " << number << endl;
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 09.04.2013, 23:53   #10
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Цитата:
Сообщение от ROD Посмотреть сообщение

Код:

int number;
    do{
        cin >> number;
        if(cin.fail())
            cout << "Not a number " << endl;
    }while(!cin.fail());
    cout << "number is " << number << endl;
Код работает, но несколько не так, как хотелось бы. При вводе символа он просто завершает программу. Хотя такой вариант лучше, чем ничего, но хотелось бы, чтобы при вводе символа просто выдавалось некоторое сообщение и предложение ввести значение еще раз.
А так спасибо
Dima-War вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Assembler!!! Заменить на символ ‘!’ каждый 3тий символ в строке. Leon9313 Помощь студентам 0 24.04.2012 13:02
Двухзначное число int записать как пару однозначных int (c++) narien Помощь студентам 2 08.01.2012 15:10
функция float average(int arrray[],int from,int to) yuliyayuliya Помощь студентам 0 25.04.2011 21:55
С++:invalid types 'int[int]' for array subscript greendoom Помощь студентам 0 19.03.2011 16:53
С++ Опереатор перезагрузки ()(int,int) Jane-sad Помощь студентам 1 08.10.2010 15:26