Есть целый ряд проблем, связанных с вашим примером.
Первой проблемой является student p[n];
. Это не является строго верным C++. Некоторые компиляторы позволяют это в качестве расширения. Не зная, какой компилятор вы используете, и с какими флагами я предполагаю, что это часть проблемы. Типичным решением этой проблемы является использование std::vector. std::vector
работает по-разному, как массив переменного размера. std::vector<student> p(n);
создаст вектор с именем p
, содержащий n
По умолчанию student
объектов.
Следующая проблема: get_input(student p[],n);
. Нет необходимости и некорректно указывать тип при передаче аргумента. Просто напишите get_input(p,n);
. В конце концов, вы не указали, что n
является int
, когда вы позвонили get_input
. Однако, поскольку p
- это std::vector
, нам нужно добавить .data()
, чтобы получить указатель на фактические данные. Будет get_input(p.data(), n);
.
Последней критической проблемой является петля for (int i = 1; i <= n1; i++)
. Представьте, что n
равно 3. Значения i
будут принимать значения 1, 2 и 3. Однако массивы индексируются начиная с 0. Если n
равно 3, вы хотите получить доступ к элементам 0, 1 и 2. Правильный цикл равен for (int i = 0; i < n1; i++)
.
Эти изменения позволят вашему примеру работать, но есть еще много улучшений, которые могут быть сделаны.
#include <iostream>
#include <vector>
using namespace std;
struct student
{
int roll_no;
char name[20];
};
void get_input(student p[], int n1)
{
for (int i = 0; i < n1; i++)
{
cout << "Enter Roll Number ";
cin >> p[i].roll_no;
cout << "\n Enter Name of the student: ";
cin >> p[i].name;
}
}
int main()
{
int n;
cout << "How many student details would you want to enter: ";
cin >> n;
//Want to create number of object based on input n
std::vector<student> p(n);
get_input(p.data(), n);
return 0;
}
Рассмотрите возможность использования std::string
вместо char name[20]
. Вам не нужно будет догадываться, как долго может быть имя, и вы не рискуете неопределенным поведением от более длинных имен.
struct student
{
int roll_no;
std::string name;
};
Рассмотрим прохождение p
по ссылке, вместо того, чтобы использовать указатель и размер.
// Declaration/definition
void get_input(std::vector<student> & p)
// Usage
get_input(p);
Рассмотрите возможность использования цикла, основанного на диапазоне, вместо обычного цикла.
void get_input(std::vector<student> & p)
{
// for each student in p
for (student & s : p)
{
cout << "Enter Roll Number ";
cin >> s.roll_no;
cout << "\n Enter Name of the student: ";
cin >> s.name;
}
}
Массивы переменной длины не допускаются на C++. Вместо этого используйте 'std :: vector'. –
nwp
@ nwp, что вы имеете в виду? 'cin >> n; студент p [n]; 'отлично работает. К OP: ну, в чем вопрос? Я вижу много опечаток/основных ошибок, но не могу опубликовать ответ на несуществующий вопрос. – Fureeish
@Fureeish. Тогда вы, вероятно, используете некоторое нестандартное расширение компилятора. –