aboutsummaryrefslogtreecommitdiff
path: root/additional2/а).cpp
blob: 78160aa221c9aa974931647e6cb00a7a435f7a66 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <cstring>

// Получава text (масив от низове, т.е. масив от редове) и размер
// Удвоява размера на text
// Бележка: може да се даде аргумента, че е по-добре да увеличаваме text със
// само една клетка всеки път, за да не заделяме излишна памет, но да кажем, че
// в този конкретен случай не е проблем.
void resize(char**& text, int& size) {
	char** biggerText = new char*[size * 2];
	for (int i = 0; i < size; i++) {
		biggerText[i] = text[i];
	}
	delete[] text;
	text = biggerText;
	size *= 2;
}

int main() {
	int size = 2;  // колко клетки сме заделили (колко редове можем да вкараме)
	int count = 0; // колко клетки използваме (колко редове сме вкарали)
	char** text = new char*[2];

	char buf[1024];
	std::cin.getline(buf, 1024, '\n');
	while (buf[0] != 'Q') {
		// ако text не може да запази още един ред
		if (count == size) {
			resize(text, size);
		}

		// вкарваме сегашния ред в text
		int lineLength = strlen(buf);

		text[count] = new char[lineLength + 1];
		for (int i = 0; i < lineLength; i++) {
			text[count][i] = buf[i];
		}
		text[count][lineLength] = '\0';
		count++;

		// вземаме следващия ред
		std::cin.getline(buf, 1024, '\n');
	}

	// изкарваме всички редове
	for (int i = 0; i < count; i++) {
		std::cout << text[i] << std::endl;
	}

	// освобождаваме памет
	for (int i = 0; i < count; i++) {
		delete[] text[i];
	}
	delete[] text;
}