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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2010, 15:15   #1
ArtSl
 
Регистрация: 14.02.2010
Сообщений: 4
По умолчанию проблема с try catch

Здравствуйте. В visual studio c++ помогите сделать защиту от ввода всего кроме цифр.
вот мой элемент программы:

Код:
std::cin.exceptions(std::ios::failbit);
  try {
   cout<<"Введите размер матрицы n:";
   std::cin >>(int) n;
       } 
             catch (std::ios::failure e) 
                {
                  std::cerr << "Input failed" << std::endl;
                  return 1;
                }
возники две проблемы:
1.Если ввести просто символ, то все нормально, он говорит ошибка и нет проблем, а при вводе к примеру 5sdfs она пропускает этот набор символов, как цифру.
2.Как сделать чтобы после неверного ввода, опять выдавалось сообщение о повторном вводе?

Последний раз редактировалось Stilet; 15.02.2010 в 09:00.
ArtSl вне форума Ответить с цитированием
Старый 14.02.2010, 16:21   #2
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

вводить данные в строковую переменную и использовать, к примеру, функцию ниже, которая определяет число это или нет.
Код:
#include <ctype.h>
#include <string>
bool isnumber(std::string str)
{
 int len = str.length();
 for (int i=0;i<len;i++)
 {
  if (isalpha(str[i])) return false;
 }
 return true;
}


int n;
string str ;
cout<<"Введите размер матрицы n:";
std::cin >>str;

if (isnumber(str)) n = atoi(str.c_str());
else n = -1;
подпись
liljon вне форума Ответить с цитированием
Старый 14.02.2010, 16:52   #3
ArtSl
 
Регистрация: 14.02.2010
Сообщений: 4
По умолчанию

спасибо что ответили, но понять ваш код я не могу, уже 4й сеестр идет прогр-е, а ф-ии atoi даж не видел, да и не скажу что силен в прогр-ии. вставил ваш код в новый проект, при вводе цифры все нормально, а при вводе буквы ошибка=(
Код:
#include "stdafx.h"
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#include <iostream>
#include <ctype.h>
#include <string>

using namespace std;


bool isnumber(std::string str)
	{
	 int len = str.length();
	for (int i=0;i<len;i++)
	 {
	 if (isalpha(str[i])) return false;
	}
	 return true;
	}

int main(void)
{
	int n;
	string str ;
	cout<<"enter n:";
	std::cin >>str;

	if (isnumber(str)) n = atoi(str.c_str());
	else n = -1;
	cout<<"in matrix ";
			 cout<<n*n;
			 cout<<" elements";

}
можете подправить? isalpha возвращает ненулевое значение, если ее аргумен является буквой, но там же вроде буквы из английского языка, а как быть с русским??

Последний раз редактировалось Stilet; 15.02.2010 в 09:00.
ArtSl вне форума Ответить с цитированием
Старый 14.02.2010, 17:01   #4
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

о других символах сразу не подумал вот по другому
Код:
bool isnumber(std::string str)
{
 int len = str.length();
 for (int i=0;i<len;i++)
 {
  if (!isdigit(str[i])) return false;
 }
 return true;
}
подпись
liljon вне форума Ответить с цитированием
Старый 14.02.2010, 17:32   #5
ArtSl
 
Регистрация: 14.02.2010
Сообщений: 4
По умолчанию

посмотрите пожалуйста:
Код:
#include "stdafx.h"
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#include <iostream>
#include <ctype.h>
#include <string>

using namespace std;

bool isnumber(std::string str)
{
 int len = str.length();
 for (int i=0;i<len;i++)
 {
  if (!isdigit(str[i])) 
  {return false;
  cout<<"error";}
 }
 return true;
}

int main(void)
{
	setlocale(LC_CTYPE,"Russian");

	int n;
	string str ;
	cout<<"enter n:";
	std::cin >>str;

	if (isnumber(str)) n = atoi(str.c_str());
	else n = -1;
	cout<<n;
}
при вводе русских букв выдает ошибку с вариантами прервать, пропустить и отмена...=(

Последний раз редактировалось Stilet; 15.02.2010 в 09:00.
ArtSl вне форума Ответить с цитированием
Старый 14.02.2010, 18:03   #6
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

Отзыв мне добавь
Код:
#include <windows.h>
#include <iostream>
#include <string>

using namespace std;

bool isnumber(std::string str)
{
 int len = str.length();
 for (int i=0;i<len;i++)
 {
  if (!isdigit((unsigned char)str[i])) return false;
 }
 return true;
}

string ToRus(string str)
{
	char * ret = new char[str.length()+1];
	OemToCharA(str.c_str(),ret);
	string r = ret;
	delete [] ret;
	return r;
}

int main(int argc, char * argv[])
{
	setlocale(LC_CTYPE,"Russian");

	int n;
	string str ;
	cout<<"enter n:";
	std::cin >> str;
	str = ToRus(str);

	if (isnumber(str)) n = atoi(str.c_str());
	else n = -1;
	cout<<n;

	return 0;
}
подпись
liljon вне форума Ответить с цитированием
Старый 14.02.2010, 18:13   #7
ArtSl
 
Регистрация: 14.02.2010
Сообщений: 4
По умолчанию

Спасибо=)) 7 часов долбался с ним. я кнопку спасибо искал, как почти на всех сайтах, все добавил!=))

можете посоветовать книги, по которым вы учились программировать??

Последний раз редактировалось Stilet; 15.02.2010 в 09:01.
ArtSl вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Visual Studio 2008 Express Edition C# - не могу применить блок try catch к FileStream I.C.E Visual C++ 1 14.12.2009 11:55
обработчик исключений try catch Hacker19_90 Общие вопросы C/C++ 1 27.02.2009 11:05
не работает вложенный catch jorjik Общие вопросы C/C++ 5 13.07.2008 22:37
try ... catch CBeginner Общие вопросы C/C++ 3 23.06.2008 07:12
try... catch Kocapb Общие вопросы C/C++ 6 19.12.2007 04:30