Вводе в консоль "бьются" данные строк и выводится абракадабра вместо заданных слов
Код усложнён потому что пытался повторить ошибку более сложного проекта (получилось), чтобы было прощё её решить.
#include <iostream>
#include <cstring>
using namespace std;
const int a = 50;
class chars {
char s[a], h[a], * j = 0, *f = 0;
public:
void set_s(char* b) {
j = s;
j = b;
}
void set_h(char* n) {
f = h;
f = n;
}
char *get_s() {
return j;
}
char* get_h() {
return f;
}
};
chars h[2];
void chars_1();
void out();
int main() {
int d = 5;
chars_1();
cin >> d;
out();
}
void chars_1() {
char c[a], d[a], * v = 0, *b = 0;
v = c;
b = d;
cin >> v;
cin >> b;
h[1].set_s(v);
h[1].set_h(b);
}
void out() {
cout << "\n";
cout << h[1].get_s() << "\n";
cout << h[1].get_h() << "\n";
}
В сегменте
int main() {
int d = 5;
chars_1();
cin >> d;
out();
}
Если задействовано cin >> d;, то вывод ломается и выводит вообще не то, что нужно, но если это строку закоментировать, то всё работает, как должно.

До добавления второго массива символов в класс всё работало, как должно вне зависимости от ввода. Мне кажется, что ошибка связана с выделением памяти для консоли, но не знаю, как это исправить и насколько вообще верно это предположение.
Ответы (1 шт):
Работаете с локальными массивами, срок жизни которых — функция...
char c[a], d[a], * v = 0, *b = 0;
v = c;
b = d;
cin >> v;
cin >> b;
h[1].set_s(v);
h[1].set_h(b);
Вот тут вы записываете v и b в h[1] —
void set_s(char* b) {
j = s;
j = b;
}
void set_h(char* n) {
f = h;
f = n;
}
но именно как указатели на массивы в функции chars_1(). Когда вы из нее вышли, массивы уничтожены, указатели остаются просто на какие-то места в памяти, которые могут быть благополучно переписаны. Типичное UB (неопределенное поведение).
Всё. Ну, а то, что при удалении cin >> d; все кажется работающим — так это просто потому что в этом случае память случайно оказалась не перезаписанной.
P.S. Кстати, у вас масса каких-то лишних телодвижений с массивами... Например, вот это
j = s;
j = b;
Смысл в первом присваивании? j тут же перезаписывается и указывает на b.
Создается ощущение, что вы не очень понимаете, как эта вся механика с массивами и указателями работает...
