Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
1

Класс - преобразование массива в строку

07.07.2013, 15:36. Показов 1654. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Кликните здесь для просмотра всего текста
C++
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <iostream> 
 
class str
{
public:
 
~str() // Деструктор, удаляет массив
{
delete[] stroka;
dlina_stroki = 0;
}
 
str() // Конструктор по умолчанию, создает массив нулевой длины
{
stroka = new char[1];
stroka[0] = '\0';
dlina_stroki = 0;
}
 
str(const char *rhs) // конструктор, преобразует массив символов в строчку
{
dlina_stroki = strlen(rhs); // устанавливаем длину массива при помощи оператора strlen
stroka = new char[dlina_stroki +1]; // выделяем память под массив на 1 элемент больше
 
for (int i = 0; i < dlina_stroki; i++)
{ stroka[i] = rhs[i]; } // переводим полученные данные (rhs) в свой массив (stroka)
stroka[dlina_stroki] = '\0'; // вставляем в последний элемент массива пробел 
}
 
str(const str & rhs) // конструктор копировщик, работает по тому же принципу что и конструктор выше
{
dlina_stroki = rhs.get_dlina_stroki();
stroka = new char[dlina_stroki + 1];
 
for (int i = 0; i < dlina_stroki; i++)
{ stroka[i] = rhs[i]; }
stroka[dlina_stroki] = '\0';
}
 
char operator[] (int rhs) const
 
{
if (dlina_stroki < rhs)
{ return stroka[dlina_stroki - 1]; }
else
{ return stroka[rhs]; }
}
 
char & operator[] (int rhs) 
{  
if (dlina_stroki < rhs)
{ return stroka[dlina_stroki - 1]; }
else
{ return stroka[rhs]; }
}
 
str & operator= (const str & rhs) // оператор равно для класса str 
{
if (this == &rhs) // проверяем, не пытаемся ли мы приравнять один и тот же объект т.е. var = var
{ return *this; } // если пытаемся, то просто возвращаем ссылку на него
 
delete[] stroka; // удаляем, то, что есть сейчас
dlina_stroki = rhs.get_dlina_stroki(); // узнаем новую длину строки
stroka = new char[dlina_stroki + 1]; // выделяем память под новый массив
 
for (int i = 0; i < dlina_stroki; i++)
{ stroka[i] = rhs[i];  } // переводим полученные данные (rhs) в свой массив (stroka)
stroka[dlina_stroki] = '\0'; // вставляем в последний элемент массива пробел
return *this; // возвращаем новое значение
}
 
str operator+ (const str & rhs)
{
int temp_dlina_stroki = get_dlina_stroki() + rhs.get_dlina_stroki(); // Узнаем необходимую длину строки для двух объектов
str temp(temp_dlina_stroki + 2); // выделяем память под новый временный объект
int i = 0;
int j = 0;
 
for (i; i < dlina_stroki; i++)
{ temp[i] = stroka[i]; } // переводим первую часть во временный массив
 
temp[i] = ' '; // вставляем между массивами (строчками) пробел
i++;
 
for (j ; j < rhs.get_dlina_stroki(); j++, i++ ) 
{ temp[i] = rhs[j];  } // переводим вторую часть во временный массив
 
temp[temp_dlina_stroki + 1] = '\0'; // вставляем в последний элемент массива пробел
return temp; // возвращаем в качестве результата временны объект
}
 
 
char *get_stroka() const { return stroka; } // функция член, возвращает массив
int get_dlina_stroki() const { return dlina_stroki; } // функция член, возвращает длину массива
void show_stroka() const { std::cout << stroka << "\n"; } // функция член, выводит на экран строку
 
private:
str(int rhs)
{
dlina_stroki = rhs;
stroka = new char[dlina_stroki +1];
for (int i = 0; i < dlina_stroki; i++)
{ stroka[i] = '\0'; }
stroka[dlina_stroki] = '\0';
}
 
 
char *stroka; // массив в котором хранится строка
int dlina_stroki; // длина массива
};
 
 
int main()
{
 
str sOne("Hello world!");
str sTwo("Nice day!");
str sThree("test");
 
sThree.show_stroka();
sThree = sOne;
sThree.show_stroka();
sThree = sOne + sTwo;
sThree.show_stroka();
 
system("pause");
return 0;
}


Пожалуйста, что делает член функция в строках 40-47 и 49 - 55, только пожалуйста не в 3-х словах, а поподробнее, что в частности будет являться rhs

Так же что именно делает закрытый конструктор в строке 98-105

И еще вопрос, подскажите как сделать что бы я мог самостоятельно вводить вводить текст после запуска программы т.е. :

C++
1
2
int var;
std::cin >> var;
А как сделать подобное в моей программе и на сколько это сложно?


Просьба, не нужно давать другой код, например strcat и т.д. мне бы хотелось решить все эти проблемы (или те которые можно) при помощи библиотеки iostream
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.07.2013, 15:36
Ответы с готовыми решениями:

Преобразование массива в строку
Здравствуйте. Подскажите пожалуйста, как следующий массив преобразовать в нужную строку. ...

Преобразование массива в строку
Допустим у нас есть рандомный текст в виде переменной string. Нужно методом split убрать из него...

Преобразование массива в строку
Приветствую. Срочно требуется ваша помощь! Итак есть скрипт, он разбивает строку в массив. Сначала...

Json преобразование массива в строку
Здравствуйте. Пишу Json класс на C# из-за неудобств Newtonsoft, для учебы и закрепления знаний....

8
28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171
07.07.2013, 16:40 2
1) Оператор [], получает символ по заданному индексу. Если заданный индекс больше длины строки, возвращает последний символ. rhs - это индекс символа, который нужно получить.

2) Создает строку заданной длины и забивает ее нуль терминаторами.

3) Можно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
  char buf[256];
  std::cout << "Input string 1: ";
  std::cin.getline(buf, 256);
  str sOne(buf);
  std::cout << "Input string 2: ";
  std::cin.getline(buf, 256);
  str sTwo(buf);
  std::cout << "Input string 3: ";
  std::cin.getline(buf, 256);
  str sThree(buf);
 
  sThree.show_stroka();
  sThree = sOne;
  sThree.show_stroka();
  sThree = sOne + sTwo;
  sThree.show_stroka();
 
  system("pause");
  return 0;
}
1
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
07.07.2013, 17:01  [ТС] 3
1. А т.е. этот оператор проверяет число внутри [], если оно больше чем у rhs, то он отнимает 1 ?

2. Примерно ясно, не ясно только str(int rhs) - int rhs откуда берется, а точнее когда я ее писал, примерно откуда берется этот int rhs я знал, сейчас подзабыл ладно, пофиг.

3. Не совсем то, что хотел, как я понимаю мы тут все же используем массив, определенной длинны, я просто хотел без длинны, что бы длинна сама определялась при работе программы при вводе с клавиатуры. А вот char buf[256], 256 это максимальная длинна, больше нельзя? например char buf[300]
0
28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171
07.07.2013, 17:10 4
VLK,
1) Длина - 1 это последний символ массива.

2) int rhs - это параметр, передается в конструктор при вызове. Это и есть длина строки, которая будет создана.

3) Можно больше. В любом случае ограничение при вводе будет. Ну или можно например, сперва спросить пользователя максимальную длину строки, пусть он введет, и такое ограничение и ставить, но это не лучший выбор.
1
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
07.07.2013, 17:23  [ТС] 5
2-3 понятно, а вот с 1 не до конца

т.е. этот оператор:
operator[] (int rhs)

он работает с

objOne[10] = objTwo[20] (числа разные для наглядности)

длину строки он будет проверять из objOne, а вот rhs в данном случае будет являться 20 из objTwo[20], правильно?
0
28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171
07.07.2013, 18:24 6
Цитата Сообщение от VLK Посмотреть сообщение
objOne[10] = objTwo[20]
Это значит, что он на позицию 10 массива objOne поместит символ с индексом 20 из массива objTwo.
Например если objOne равен "Hello world", а objTwo равен "Hello world, i study c++", то в результате операции выйдет, что objOne будет равен: "Hello worly", а ObjTwo не изменится
0
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
08.07.2013, 12:45  [ТС] 7
В каком случае выполнится строчка return stroka[dlina_stroki - 1], я вот сделал программку (пишет когда какая строчка выполняется), как не крутил, ни когда не выполнялась эта строчка

Эта строчка нужна для тех случаев когда есть ошибка в программе? и служит для того, что бы массив не вышел за область видимости?
0
28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171
10.07.2013, 22:29 8
VLK, Вообще, да. Ситуация когда кто-то пытается получить элемент из массива с индексом больше, чем всего элементов, это ошибка. И я тут исключение поставил бы, а не возврат последнего символа. Чтобы выполнилась эта строка, можно написать например:
C++
1
2
str stroka("stroka");
stroka[N]; // где N - число большее либо равное длине строки (в данном случае N = 6 или больше).
1
Tulosba
11.07.2013, 10:27     Класс - преобразование массива в строку
  #9

Не по теме:

Цитата Сообщение от Riderik Посмотреть сообщение
с индексом больше, чем всего элементов,
Еще отрицательные индексы не забудьте :)

1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.07.2013, 10:27

Преобразование массива чисел в строку
Задание: Реализовать функцию ArrayToString, осуществляющую преобразование массива целых чисел из...

Преобразование массива строк в строку
Есть массив строк, &quot;ля&quot;,&quot;ля&quot;,&quot;ля&quot;,&quot;ля&quot;. нужно склеить их в одну строку. string.Concat(str) клеит...

Преобразование массива целых в строку
Здравствуйте! как записать массив чисел в строку? элементы массива целых,это байты данных. делаю...

Преобразование массива чисел в строку
Всем доброе утро. Стал перед такой проблемой, при работе с большими массивами чисел/данных и т.д и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru