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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2014, 16:07   #1
GooderSteel
Пользователь
 
Регистрация: 09.10.2011
Сообщений: 11
По умолчанию Почему не выводятся строки в консоль?(С++)

Здравствуйте, возникла такая проблема. Решаю упражнения из книги Лафоре "Объектно ориентированное программирование в С++". Написал следующий код в качестве решения задания 8 главы 9:
Код:
#include <iostream>
using namespace std;
#include <string.h>       // для функций str*
///////////////////////////////////////////////////////////
class String
{
protected:
	enum { SZ = 100 };	  // размер массива
	char str[SZ];         // массив для хранения строки
public:
	// конструктор без параметров
	String()
	{
		str[0] = '\x0';
	}
	// конструктор с одним параметром
	String(char s[])
	{
		strcpy(str, s);
	} // сохраняем строку в массиве
	// показ строки
	void display() const
	{
		cout << str;
	}
	// перевод строки к обычному типу
	operator char* ()
	{
		return str;
	}
};
///////////////////////////////////////////////////////////

class Pstring :public String	//Этот класс является производным от String
{
public:
	Pstring() :String(){};
	Pstring(char s[])
	{
		if (strlen(s) > SZ - 1)
		{
			for (int i = 0; i < SZ - 1; i++)
				str[i] = s[i];
			str[SZ - 1] = '\x0';
		}
		else
			String(s);
	}
	void display() const
	{
		String::display();
	}
};

class Pstring2 : public Pstring
{
public:
	Pstring2() :Pstring(){};
	Pstring2(char s[]) :Pstring(s){};
	Pstring2& left(Pstring2, int);
	Pstring2& mid(Pstring2, int, int);
	Pstring2& right(Pstring2, int);
	void display() const
	{
		Pstring::display();
	}
};

//В строку класса помещаются n самых левых символов строки s1
Pstring2& Pstring2::left(Pstring2 s1, int n)
{
	int size = strlen(str);
	char ss[SZ];
	strcpy(ss, str);
	for (int i = 0; i < strlen(s1.str); i++)
	{
		if (i == n)
		{
			ss[size] = '\x0';
			break;
		}
		else
		{
			if (size != SZ)
			{
				ss[size] = s1.str[i];
				size++;
			}
			else
			{
				//если массив стал наибольшей возможной длины
				ss[size] = '\x0';
				size++;
				break;
			}
		}
	}

	return Pstring2(ss);
}

//В строку помещаются n символов из строки s1 начиная с s
Pstring2& Pstring2::mid(Pstring2 s1, int s, int n)
{
	int size = strlen(str);
	char ss[SZ];
	strcpy(ss, str);
	for (int i = 0; i < n; i++)
	{
		if (i == n)
		{
			ss[size] = '\x0';
			break;
		}
		else
		{
			if (size != SZ)
			{
				ss[size] = s1.str[i + s];
				size++;
			}
			else
			{
				//если массив стал наибольшей возможной длины
				ss[size] = '\x0';
				size++;
				break;
			}
		}
	}

	return Pstring2(ss);
}

Pstring2& Pstring2::right(Pstring2 s1, int n)
{
	int size = strlen(str);
	char ss[SZ];
	strcpy(ss, str);
	for (int i = strlen(s1.str) - n; i < strlen(s1.str); i++)
	{
		if (i == n)
		{
			ss[size] = '\x0';
			break;
		}
		else
		{
			if (size != SZ)
			{
				ss[size] = s1.str[i];
				size++;
			}
			else
			{
				//если массив стал наибольшей возможной длины
				ss[size] = '\x0';
				size++;
				break;
			}
		}
	}

	return Pstring2(ss);
}

///////////////////////////////////////////////////////////
int main()
{
	setlocale(LC_CTYPE, "rus");
	const int SZ = 100;

	char xstr[] = "Ура, товарищи!"; // создаем обычную строку

	Pstring2 s1 = xstr;

	s1.display();					// показываем строку

	Pstring2 s2("Мы победим!");		// снова используем конструктор с параметром

	s2.display();
	Pstring2 s3 = s1.left(s2, 11);

	cout << static_cast<char*>(s3); // используем оператор перевода типа
	cout << endl;

	s3 = s3.left(s2, 11);

	cout << static_cast<char*>(s3); // используем оператор перевода типа
	cout << endl;

	std::system("pause");
	return 0;
}
Однако, если его скомпилить и запустить, то почему-то наотрез отказывается работать функция display. Может кто подсказать почему?
GooderSteel вне форума Ответить с цитированием
Старый 07.10.2014, 16:49   #2
Scorpius
Пользователь
 
Регистрация: 06.10.2014
Сообщений: 26
По умолчанию

Попробуй так, для вставки знака новой строки и очистки буфера:
Код:
void display() const
{
    cout << str << endl;
}
или так, если не нужен символ перевода строки:

Код:
void display() const
{
    cout << str;
    cout.flush();
}
Не всегда говори то, что знаешь, но всегда знай, что говоришь.
Scorpius вне форума Ответить с цитированием
Старый 12.10.2014, 16:29   #3
GooderSteel
Пользователь
 
Регистрация: 09.10.2011
Сообщений: 11
По умолчанию

Нашел ошибку в коде, вообщем дело было в неправильно написанном конструкторе, ниже приведу рабочий код:
Код:
#include <iostream>
#include <string.h>       // для функций str*
using namespace std;

///////////////////////////////////////////////////////////
class String
{
protected:
	enum { SZ = 100 };	  // размер массива
	char str[SZ];         // массив для хранения строки
public:
	// конструктор без параметров
	String()
	{
		str[0] = '\0';
	}
	// конструктор с одним параметром
	String(char s[])
	{
		strcpy(str, s);
	} // сохраняем строку в массиве
	// показ строки
	void display() const
	{
		cout << str << endl;
	}
	// перевод строки к обычному типу
	operator char* ()
	{
		return str;
	}
};
///////////////////////////////////////////////////////////

class Pstring :public String	//Этот класс является производным от String
{
public:
	Pstring() :String(){};
	Pstring(char s[])
	{
		if (strlen(s) > SZ - 1)
		{
			for (int i = 0; i < SZ - 1; i++)
				str[i] = s[i];
			str[SZ - 1] = '\0';
		}
		else
			strcpy(str, s);
	}
};

class Pstring2 : public Pstring
{
public:
	Pstring2() :Pstring(){};
	Pstring2(char s[]) :Pstring(s){};
	Pstring2& left(Pstring2, int);
	Pstring2& mid(Pstring2, int, int);
	Pstring2& right(Pstring2, int);
};

//В строку класса помещаются n самых левых символов строки s1
Pstring2& Pstring2::left(Pstring2 s1, int n)
{
	int size = strlen(str);
	char ss[SZ];
	strcpy(ss, str);
	for (int i = 0; i < strlen(s1.str)+1; i++)
	{
		if (i == n)
		{
			ss[size] = '\0';
			break;
		}
		else
		{
			if (size != SZ)
			{
				ss[size] = s1.str[i];
				size++;
			}
			else
			{
				//если массив стал наибольшей возможной длины
				ss[size] = '\0';
				size++;
				break;
			}
		}
	}

	return Pstring2(ss);
}

//В строку помещаются n символов из строки s1 начиная с s
Pstring2& Pstring2::mid(Pstring2 s1, int s, int n)
{
	int size = strlen(str);
	char ss[SZ];
	strcpy(ss, str);
	for (int i = 0; i < n + 1; i++)
	{
		if (i == n)
		{
			ss[size] = '\0';
			break;
		}
		else
		{
			if (size != SZ)
			{
				ss[size] = s1.str[i + s];
				size++;
			}
			else
			{
				//если массив стал наибольшей возможной длины
				ss[size] = '\0';
				size++;
				break;
			}
		}
	}

	return Pstring2(ss);
}

Pstring2& Pstring2::right(Pstring2 s1, int n)
{
	int size = strlen(str);
	char ss[SZ];
	strcpy(ss, str);
	for (int i = strlen(s1.str) - n; i < strlen(s1.str) + 1; i++)
	{
		if (i == n)
		{
			ss[size] = '\0';
			break;
		}
		else
		{
			if (size != SZ)
			{
				ss[size] = s1.str[i];
				size++;
			}
			else
			{
				//если массив стал наибольшей возможной длины
				ss[size] = '\0';
				size++;
				break;
			}
		}
	}

	return Pstring2(ss);
}

///////////////////////////////////////////////////////////
int main()
{
	setlocale(LC_CTYPE, "rus");
	const int SZ = 100;

	char xstr[] = "Ура, товарищи!"; // создаем обычную строку

	Pstring2 s1 = xstr;

	s1.display();					// показываем строку

	Pstring2 s2("Мы победим!");		// снова используем конструктор с параметром

	s2.display();
	Pstring2 s3 = s1.left(s2, 11);

	cout << static_cast<char*>(s3); // используем оператор перевода типа
	cout << endl;

	s3 = s3.right(s2, 11);

	cout << static_cast<char*>(s3); // используем оператор перевода типа
	cout << endl;

	s3 = s3.mid(s1, 0 ,14);

	cout << static_cast<char*>(s3); // используем оператор перевода типа
	cout << endl;

	std::system("pause");
	return 0;
}
GooderSteel вне форума Ответить с цитированием
Старый 12.10.2014, 22:02   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

У вас дублирование значения константы в классе и main(). Вот так можно этого избежать:

Код:
#include <iostream>

class A
{
public:
    enum { SZ = 100 };
};

int main()
{
    A a;

    std::cout << a.SZ << std::endl;

    return 0;
}
Я использую в качестве строк везде объекты класса std::string вместо сишных char:

Код:
#include <iostream>
#include <string>

int main()
{
    std::string str = "Hello, World!";
    std::cout << str << std::endl;
    return 0;
}
8Observer8 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу понять почему не правильно выводятся числа массива Nikitos_ Паскаль, Turbo Pascal, PascalABC.NET 7 31.05.2012 11:52
почему не удаляет строки ubun PHP 2 22.12.2011 20:39
C++(консоль)файлы строки masterwolf Общие вопросы C/C++ 0 19.06.2010 18:47
Почему данные не сохраняются или не выводятся? SnowFall Помощь студентам 4 12.05.2009 01:21
Почему то пустые строки zotox Помощь студентам 3 24.03.2009 15:26