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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2011, 17:48   #1
kukumumu
 
Регистрация: 28.12.2010
Сообщений: 7
Смущение c++ - что-то не то с очисткой буфера

делаю упражнение на тему "наследование". в функции main() пользователь в цикле вводит строку, а потом выводится заданное число символов слева, справа и из середины заданной строки.

первый раз все получается, а потом ничего не получается ввести. результат работы программы выглядит так (причем, что странно, из середины прошлой строки символы выводятся! - сравнивала несколько раз три метода- вроде одинаковые!) :


Enter something..
012345678901234567890


a=012345678901234567890
b1=012345
b2=3456789012
b3=90

Continue? y
Enter something..


a=
b1=
b2=3456789012
b3=

Continue?




листинг такой:
Код:
#include <iostream>
using namespace std;
#include <string.h>
#include <conio.h>

class String
{
protected:
	static const int  SZ=80;
	char str[SZ];
public:
	String() //конструктор без параметров
	{str[0]='\0';}

	String(char s[])//Конструктор с параметрами
	{strcpy_s(str,s);}

	void get()       вот он! тот самый злощастный метод get! Я уже и переменную tmp ввела - не помогает!
	{
		char tmp[SZ];
		cout<<endl<<"Enter something.. "<<endl;
		cin.get(tmp,SZ);
		strcpy(str,tmp);
		cout<<endl;
	}

	void display() //Отображение строки
	{cout<<str;}

	String operator+(String ss)//сложение 2 строк
	{
		String temp; //создаем переменную для записи результата
		if ((strlen(str)+strlen(ss.str))<SZ) //проверяем, не переполнится ли буфер
		{
			strcpy_s(temp.str,str); //копируем в нашу переменную строку исходного объекта
			strcat_s(temp.str,ss.str); //добавляем туда же плюсуемую строку
		}
		else
		{
			cout << "Perepolnenie!"; //если слишком длинно, выходим
			exit(1);
		}
		return temp;
	}
};
class Pstring: public String //класс-потомок
{
public:
	Pstring()//конструктор без параметров
	{String();}
	Pstring(char s[]) //конструктор с параметром
	{
		int tst = strlen(s);
		int tst1 = SZ - 1;
		if (tst<tst1)
			strcpy_s(str,s);
		else
		{
			for(int i=0;i<(SZ-1);i++)
				str[i]=s[i];
			str[SZ-1]='\0';
		}
	}
};
class Pstring2: public Pstring
{
public:
	Pstring2():Pstring()
	{}
	Pstring2(char s[]):Pstring(s)
	{}
	Pstring2& left_(Pstring2 s1, int n);
	Pstring2& mid_(Pstring2 s1,int s,int n);
	Pstring2& right_(Pstring2 s1,int n);
};
Pstring2& Pstring2::left_(Pstring2 s1,int n)
{	if (n>(SZ-1)) //проверяем,не вылезаем ли мы за границы массива
		n=SZ-1;
	int i;
	for (i=0;i<n;i++) //копируем посимвольно
		str[i]=s1.str[i];
	str[n]='\0';
	return Pstring2(str);//возвращаем временный объект
}
Pstring2& Pstring2::mid_(Pstring2 s1,int s, int n)
{
	if (n>(SZ-1)) //проверяем,не вылезаем ли мы за границы массива
		n=SZ-1;
	if ((strlen(s1.str)-(s-1))<n) //проверяем, не меньше ли у нас символов, чем n
		n=strlen(s1.str)-(s-1);


	for (int i=0;i<n;i++)     //копируем посимвольно
		str[i]=s1.str[i+s-1]; 
	str[n]='\0';
	return Pstring2(str);

}

Pstring2& Pstring2::right_(Pstring2 s1, int n)
{
	if (n>(SZ-1)) //проверяем,не вылезаем ли мы за границы массива
		n=SZ-1;
	if (n>strlen(s1.str))
		n=strlen(s1.str);
	for (int i=0;i<n;i++)
		str[i]=s1.str[strlen(s1.str)-(n-i)];
	str[n]='\0';
	return Pstring2(str);
}
int main()
{
	Pstring2 a,b1,b2,b3;
	char ch='0';
	do
	{
		a.get();
		b1.left_(a,6);
		b2.mid_(a,4,10);
		b3.right_(a,2);
		cout<<endl<<"a=";a.display();
		cout<<endl<<"b1=";b1.display();
		cout<<endl<<"b2=";b2.display();
		cout<<endl<<"b3=";b3.display();
		cout<<endl<<endl<<"Continue? ";
		ch=_getche();
	}
	while (ch!='n');

	return 0;
}

люди добрые, помогите разобраться! заранее спасибо.

Последний раз редактировалось Stilet; 17.09.2011 в 08:37.
kukumumu вне форума Ответить с цитированием
Старый 16.09.2011, 18:51   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Вместо cin.get напиши cin.getline.
Son Of Pain вне форума Ответить с цитированием
Старый 16.09.2011, 21:09   #3
snajper_ro
 
Регистрация: 13.09.2011
Сообщений: 9
По умолчанию

хорошая табуляция,видел как то текст специально сложен по вертикали
snajper_ro вне форума Ответить с цитированием
Старый 17.09.2011, 00:58   #4
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

cin.clear cin.ignore в помощь, тема уже где-то была...
counter вне форума Ответить с цитированием
Старый 17.09.2011, 21:51   #5
kukumumu
 
Регистрация: 28.12.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от counter Посмотреть сообщение
cin.clear cin.ignore в помощь, тема уже где-то была...
спасибо за совет. если честно, я пробовала, но не получилось. может, что-то не так сделала...
kukumumu вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
переполнение буфера Dimarik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 13.07.2011 02:24
из буфера в TMemoryStream designer999 Общие вопросы Delphi 3 10.01.2011 19:23
Метод Z-буфера stscolt Помощь студентам 0 21.11.2009 19:12
Как узнать что в содержимое буфера обмена добавилось что либо? zotox Общие вопросы Delphi 2 15.09.2009 12:07
Проблема с очисткой DBF Mastela БД в Delphi 7 03.06.2007 23:21