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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2014, 21:54   #1
spectrum988
Форумчанин
 
Аватар для spectrum988
 
Регистрация: 24.10.2013
Сообщений: 241
По умолчанию Работа с типом string.

Здравствуйте,работаю на программой шифрования(шаговая замена).Возникла проблема при работе с русскими буквами,выбивает такие ошибки.
Код:

	string england = "abcdefghijklmnopqrstuvwxyz";
	string symbol = "!%'()*+,-./0123456789:;<=>? ";
	string russian = "абвгдежзийклмнопрстуфхцчшщъыьэюя";
....
for (int i = 0; i < len; i++)
	{
		if (isupper(s[i]))
		{
			for (int j = 0; j <size; j++)
			{
				if (tolower(s[i]) == language[j])
				{
					poz = j;
					if (poz <=size)
					{
						new_poz = (poz + root) % size;
						s[i] = toupper(language[new_poz]);
					}
					break;
				}
			}
		}
		else
		{
			for (int j = 0; j < size; j++)
			{
				if (s[i] == language[j])
				{
					poz = j;
					if (poz <=size)
					{
						new_poz = (poz + root) % size;
						s[i] = language[new_poz];
					}
					break;
				}
				if (s[i] == symbol[j])
				{
					new_poz = j;
					s[i] = symbol[new_poz];
					break;
				}
			}
		}
	}
	return s;
}
1.png
Пробовал перевести содержимое ошибки,но так и не понял.Подскажите пожалуйста.
spectrum988 вне форума Ответить с цитированием
Старый 30.11.2014, 21:58   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Выход за пределы массива видимо...
Ты проводил пошаговую отладку?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.11.2014, 23:27   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,833
По умолчанию

Цитата:
The behavior of isupper and _isupper_l is undefined if c is not EOF or in the range 0 through 0xFF, inclusive. When a debug CRT library is used and c is not one of these values, the functions raise an assertion.
Кто такой s?
p51x вне форума Ответить с цитированием
Старый 30.11.2014, 23:33   #4
spectrum988
Форумчанин
 
Аватар для spectrum988
 
Регистрация: 24.10.2013
Сообщений: 241
По умолчанию

Проводил,первая ошибка "границ массива" появилась в данной строке кода.
Код:
if (isupper(s[i]))
Еще между ошибками как вы говорили "границ массива" проходит еще одна ошибка.
2.png

Цитата:
Сообщение от p51x Посмотреть сообщение
Кто такой s?
Имя массива
Код:
string s;
С латиницей программа работает без проблем,а кириллица не хочет.

Последний раз редактировалось Stilet; 01.12.2014 в 08:00.
spectrum988 вне форума Ответить с цитированием
Старый 01.12.2014, 00:52   #5
Zenon
Пользователь
 
Регистрация: 03.07.2014
Сообщений: 32
По умолчанию

isupper, tolower и прочие работают только с английскими буквами

на это и ругается

пользуйтесь wstring или напишите свои isupper/tolower/...
Zenon вне форума Ответить с цитированием
Старый 01.12.2014, 01:15   #6
spectrum988
Форумчанин
 
Аватар для spectrum988
 
Регистрация: 24.10.2013
Сообщений: 241
По умолчанию

Спасибо.Я так и подумал,так как заменил эту функцию, диапазоном ANSI и не было ошибки.
spectrum988 вне форума Ответить с цитированием
Старый 01.12.2014, 16:18   #7
spectrum988
Форумчанин
 
Аватар для spectrum988
 
Регистрация: 24.10.2013
Сообщений: 241
По умолчанию

Переписал код программы:
Код:
string england = "abcdefghijklmnopqrstuvwxyz";
	string symbol =  "!%'()*+,-./0123456789:;<=>? ";
	string russian = "абвгдежзийклмнопрстуфхцчшщъыьэюя";
Код:
string Caesar::Shifr(int root,int size, string language, string s)
{
	len = s.size();
	for (int i = 0; i < len; i++)
	{
		if (regystry(s[i]))
		{
			for (int j = 0; j <size; j++)
			{
				if (smal(s[i]) == language[j])
				{
					poz = j;
					if (poz <=size)
					{
						new_poz = (poz + root) % size;
						s[i] = great(language[new_poz]);
					}
					break;
				}
			}
		}
		else
		{
			for (int j = 0; j < size; j++)
			{
				if (s[i] == language[j])
				{
					poz = j;
					if (poz <=size)
					{
						new_poz = (poz + root) % size;
						s[i] = language[new_poz];
					}
					break;
				}
			}
			for (int j = 0; j < len2; j++)
			{
				if (s[i] == symbol[j])
				{
					new_poz = j;
					s[i] = symbol[new_poz];
					break;
				}
			}
		}
	}
	return s;
}
Написал свои функции:
Код:
bool Caesar::regystry(char s)
{
	if (((s >= 65) && (s <= 90)) || ((s >= 192) && (s <= 223)))
	{
	  return true;
	}
	else
	{ 
		return false;
	}
}
char Caesar::smal(char s)
{
	int new_i = 0;
	if (((s >= 65) && (s <= 90)) || ((s >= 192) && (s <= 223)))
	{
		s+=32;
		return s;
	}
}
char Caesar::great(char s)
{
	int new_i = 0;
	if (((s >= 97) && (s <= 122)) || ((s >= 224) && (s <= 255)))
	{
		s-=32;
		return s;
	}
}
Работает полностью с английским алфавитом,а с русским только с нижним регистром символов,причем не выдает никаких ошибок.
Не могу никак понять,что делает не так.
spectrum988 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с типом real Sparky Помощь студентам 8 18.10.2013 09:57
Работа с ограниченным типом Alexan-Dwer Паскаль, Turbo Pascal, PascalABC.NET 4 05.02.2012 14:24
Ошибка при работе с типом String Sibedir Общие вопросы Delphi 13 18.09.2010 15:44
Работа с типом днных STRING Nika2010 Помощь студентам 10 16.02.2010 07:18
Работа с типом Record TheNovice Помощь студентам 4 28.02.2007 17:52