Создание структуры C++
Ну очень нужна помощь, я больше не могу, ну не понимаю и всё тут. Хочу циклом заполнять массив из структур. Создаю структуру, в ней два поля. Предположим, что первое поле - это int, а второе - массив char. В функции main сначала надо ввести количество структур в массиве, а потом циклом заполнять его. Моя функция заменяет все поля char на последнее введенное значение. Вот мой код.
struct Die {
int sqrt = 0;
char* str;
};
int main() {
char* s = new char[10];
Die* mas = new Die[10];
int N;
int j = 0;
std::cin >> N;
for (int i = 0; i < N;i++) {
std::cin >> s;
mas[i] = { j, s }; //заполняем структуру, где первое поле - индекс, а второе - строка
std::cout << mas[i].sqrt << ' ' << mas[i].str << std::endl; //если выводим так, то все нормально
j += 1;
}
std::cout << "_________" << std::endl;
for (int i = 0; i < N; i++) {
std::cout << mas[i].sqrt << ' ' << mas[i].str << std::endl; //а если вот так, то беда
}
}
Вывод
3
aaa bbb ccc
0 aaa
1 bbb
2 ccc _____________
0 ccc
1 ccc
2 ccc
Пожалуйста, помогите...
Ответы (2 шт):
Ну Вы же один раз выделили память под строку, указатели во всех записях указывают на один адрес, и естественно, что там последнее назначенное лежит.
Делайте mas[i].str = new char[10]; для каждой структуры
у вас получается один указатель на массив букв (строку) для всех элементов массива, поскольку вы передаете в массив лишь указатель на строку
поэтому когда вы выводите содержимое массива уже после ввода всех значений, то вам выводится последний ввод
т.е. если образно - у вас куча народу и вместо того, чтобы каждому дать по коробке вы дали по планшету на который выводится видео из одной коробки и естественно все видят одно и тоже
вам надо каждый раз выделять память под строку и записывать строку
for (int i = 0; i < N;i++) {
char* text= new char[10];
std::cin >> text;
mas[i] = { j, text}; //заполняем структуру, где первое поле - индекс, а второе - строка
std::cout << mas[i].sqrt << ' ' << mas[i].str << std::endl; //если выводим так, то все нормально
j += 1;
}
и вот тогда все будет работать
но лучше всего добавить в вашу структуру конструктор, чтобы наружи не делать лишних выделений памяти, а спрятать это всё вовнутрь структуры, например
struct Die {
int sqrt = 0;
char* str = nullptr;
// конструктор
Die(const int l_sqrt, const char* l_str) {
sqrt = l_sqrt;
str = new char[strlen(l_str) + 1];
strcpy(str, l_str);
}
// деструктор
~Die() {
delete [] str;
}
};
и тогда можете использовать так:
for (int i = 0; i < N;i++) {
std::cin >> s;
mas[i] = Die(j, s); //заполняем структуру, где первое поле - индекс, а второе - строка
std::cout << mas[i].sqrt << ' ' << mas[i].str << std::endl; //если выводим так, то все нормально
j += 1;
}