Почему этот код:
struct books {
char* autor;
char* title;
};
int main(){
books katalog[10];
std::cin >> katalog[0].autor;
std::cout<< katalog[0].autor << std::endl;
...
}
Вызывает следующую ошибку?
An exception was thrown: write access violation **_Str** was 0xccccccc.
У Вас структура, в которой два поля указатели на массив символов. Но память под них не выделяется. Поэтому и происходит вышеуказанная ошибка.
Самый простой, правильный и надежный способ это исправить, это использовать тип std::string
.
struct books {
std::string autor;
std::string title;
}
Использовать char*
нужно только если это пишется для поддержки и си кода (маловероятно), либо так очень сильно захотел преподаватель.
Вы пытаетесь вводить и выводить адрес обьекта под которого Вы не выделяли память. Вместо указателей можете хранить char[] с каким то размером, который можете задать как аргумент шаблона. Пример:
#include <iostream>
template < size_t n >
struct books {
static const unsigned k = n;
char autor[k];
char title[k];
};
int main()
{
books<2> katalog[10];
std::cin >> katalog[0].autor;
std::cout<< katalog[0].autor << std::endl;
// для проверки посмотрим на размер books::autor
std::cout << sizeof(books<2>::autor);
return 0;
}
Да, чуть не забыл - в вашем примере наверное есть смысль вводить элементы autor, а не autor
for (size_t i = 0; i < sizeof(books<2>::autor); ++i)
std::cin >> katalog[0].autor[i];
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
ввести предложения и вывести на экран те его слова, в которых удвоение букв, или вывести сообщение об отсутствии таких словНельзя использовать...
Заданный массив с n чиселПоменять местами последний элемент с первым элементом, равным x