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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2012, 23:50   #1
Playa-RC
Пользователь
 
Регистрация: 03.12.2011
Сообщений: 13
По умолчанию Ошибка при работе функции вызванной из SWITCHa

Почему при выборе первого элемента SWITCHa, то есть case 1, функция Enter_Data() работает не правильно, игнорируются некоторые строки? А если вызвать функцию из любого другого места программы, то все отлично работает, почему так? Помогите найти ошибку, заранее спасибо!

Код:

Код:
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <string>
using namespace std;

const int n=256;
char text[n], keys[n], c[n], rt[n],key[n];
int textlen, keylen;

void Ecrypt()
{
	for(int i=0;i<textlen;i++)
	{
		c[i]=(text[i]+key[i]-2*'a')%26+'a';
	}
	cout<<"Зашифрованная строка -> ";
	for(int i=0;i<textlen;i++)
		cout<<c[i];
	cout<<endl;
}

void Decrypt()
{
	for(int i=0;i<textlen;i++)
	{
		rt[i]=(c[i]-key[i]+26)%26+'a';
	}
	cout<<"Рaсшифрованная строка -> ";
	for(int i=0;i<textlen;i++)
		cout<<rt[i];
	cout<<endl;
}

void Enter_Data()
{
	cout<<"Введите текст ->";
	cin.getline(text,n);
	textlen=strlen(text);
	cout<<"Введите ключ ->";
	cin.getline(keys,n);
	keylen=strlen(keys);
	//Формирование строки, длиной дешифруемой, состоящей из повторений ключа
	for(int i=0, j=0;i<textlen;i++,j++)
	{
		key[i]=keys[j%keylen];
	}
}

void main()
{
	SetConsoleOutputCP(1251);
	int k;
	do
	{
		cout<<"\nДействия:"<<endl/*<<"1 - Ввод данных"<<endl*/<<"2 - Зашифровать"<<endl<<
"3 - Дешифровать"<<endl<<"4 - Вывод данных на экран"<<endl<<"0 - Выход"<<endl;
		cin>>k;
		switch(k)
		{
		case 1:
			{
				Enter_Data();
				break;
			}
		case 2:
			{
				Ecrypt();
				break;
			}
		case 3:
			{
				Decrypt();
				system("pause");
				system("cls");
				break;
			}
		case 4:
			{
				cout<<"Иcходный текст -> ";
				cout<<text<<endl;
				cout<<"Заданный ключ -> ";
				cout<<key<<endl;
				cout<<"Зашифрованный текст -> ";
				cout<<c<<endl;
				break;
			}
		case 0:
			{
				cout<<"Выход!"<<endl;
				break;
			}
		default:
			{
				cout<<"Ошибочный ввод!"<<endl;
				break;
			}
		}
	}while(k!=0);
        system("pause");
}

Последний раз редактировалось Stilet; 20.09.2012 в 07:42.
Playa-RC вне форума Ответить с цитированием
Старый 20.09.2012, 14:26   #2
monolit111
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 95
По умолчанию

повставляй в неисправную функцию вывод где только можно, смотри, до какого шага доходит, сколько итераций в цикле происходит...Ну, в общем, данные вводи во время отладки то, следи за процессом..
monolit111 вне форума Ответить с цитированием
Старый 20.09.2012, 14:58   #3
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Вот:

Код:
for(int i=0, j=0;i<textlen;i++,j++)
Рискну предположить, что грабли в этих циклах.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 21.09.2012, 13:03   #4
alsav22
Пользователь
 
Регистрация: 09.02.2012
Сообщений: 32
По умолчанию

Перед вызовом функции Enter_Data() у вас есть cin >> . Он оставляет в птоке ввода символ новой строки '\n' (при нажатии Enter). Для getline(), в функции Enter_Data(), он будет первым символом, который она считает. Для неё это пустая строка. Она извлечёт '\n' из потока, в text поместит '\0' и код пойдёт дальше. Чтобы исправить, в начале функции Enter_Data(), поставьте или:
Код:
cin.sync();
(в линукс не работает) или конструкцию:
Код:
while (cin.get() != '\n');
Это очистит входной поток. Можно ещё после cin >>, сделать cin.get(), он извлечёт из потока оставшийся символ '\n'.
alsav22 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при работе с Proxy RageGod Общие вопросы .NET 0 13.07.2012 16:10
процедуры и функции при работе с массивами irina belka Помощь студентам 1 12.12.2010 16:33
ошибка при работе с указателем Vladss Общие вопросы C/C++ 22 29.07.2009 03:58
Ошибка при работе с объектами transgd Microsoft Office Excel 11 25.06.2009 09:26
Ошибка при работе с БД malevich БД в Delphi 8 25.11.2007 15:10