2017-02-07 15 views
1

Я хочу создать ряд объектов структуры, используя входные данные от пользователя
, например:
Я хочу, чтобы принять значение пользователя n и создать n количества объектов и передать эти объекты на функцию, где я инициализирую переменные к ним.Создание объекта с помощью пользовательского ввода,

#include <iostream> 
#include<string> 
#include "stdio.h" 

using namespace std; 

struct student 
{ 
    int roll_no; 
    char name[20]; 
}; 

void get_input(student p[],int n1) 
{ 
    for(int i=1;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 
    student p[n]; 
    get_input(student p[],n); 

    return 0; 
} 
+5

Массивы переменной длины не допускаются на C++. Вместо этого используйте 'std :: vector '. – nwp

+0

@ nwp, что вы имеете в виду? 'cin >> n; студент p [n]; 'отлично работает. К OP: ну, в чем вопрос? Я вижу много опечаток/основных ошибок, но не могу опубликовать ответ на несуществующий вопрос. – Fureeish

+3

@Fureeish. Тогда вы, вероятно, используете некоторое нестандартное расширение компилятора. –

ответ

1

Есть целый ряд проблем, связанных с вашим примером.

Первой проблемой является 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; 
    } 
} 
0

Используйте vector из student: Вот несколько примеров кода, как вы можете это сделать:

#include <iostream> 
#include <string> 
#include <vector> 
#include "stdio.h" 

using namespace std; 

struct student 
{ int roll_no; 
    char name[20]; 
}; 

void get_input(vector<student> & p1, int n1) 
{ 
    for (int i=0; i<n1; i++) 
    { 
     student s; 
     cout<<"Enter Roll Number: "; 
     cin>>s.roll_no; 
     cout<<"\n Enter Name of the student: "; 
     cin>>s.name; 
     p1.push_back(s); 
    } 
} 

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 
    vector<student> p; 
    get_input(p, n); 


    return 0; 
} 
+0

@Francois благодарит многое, что помогло мне очистить много понятий. Спасибо Раме за то, что он дал мне понять другой подход – Step