Выполнение программы заканчивается после ввода переменной char в C ++ - PullRequest
1 голос
/ 16 октября 2019

Я написал программу, которая запрашивает имя ученика и его оценки. Все компилируется, но после выполнения программа запрашивает только имя и затем останавливается.

#include <iostream>

int main(){
    class student{
        public :
        char *name;
        int marks1; int marks2;

        student(char* n, int n1, int n2){
            name=n, marks1=n1, marks2=n2;
        }

        int calc_med(){return (marks1+marks2)/2;}

        void display(){
            std::cout<<name<<"\n The mediane is >> "<<calc_med()<<"\n";
        }
    };

    char *name1;
    std::cout<<"Enter the student's name > ";
    std::cin>>name1;
    int m1;
    std::cout<<"Enter the first mark > ";
    std::cin>>m1;   
    int m2;
    std::cout<<"Enter the second mark > ";
    std::cin>>m2;


    student student1(name1,m1,m2);
    student1.display();

    return 0;
}

Ответы [ 2 ]

7 голосов
/ 16 октября 2019

Вы должны выделить name (или name1, как это может быть).

Есть много способов сделать это, но лучше всего либо а) использовать std::string:


std::string name;

или b) превратить имя в массив:

char name[BUFFER_SIZE]; // BUFFER_SIZE is some constant

Примечание : b) может потребоваться некоторая специальная логика, чтобы убедиться, что вы этого не сделаетепройдите мимо BUFFER_SIZE, но я оставлю это на ваше усмотрение, чтобы выяснить.

1 голос
/ 16 октября 2019

В этой части вашего кода:

char *name1;
std::cout<<"Enter the student's name > ";
std::cin>>name1;

name1 - это просто переменная, которая может хранить адрес типа char. Если вы хотите передать данные в эту переменную, попробуйте выделить некоторую память для name1 следующим образом:

char *name1 = new char[50];

Теперь у name1 есть фрагмент непрерывной памяти, в который можно поместить до 50 char ценности. new выделит это пространство, а затем даст name1 адрес, по которому существует это пространство.

Ваша программа аварийно завершает работу из-за неопределенного поведения при попытке назначить данные неопределенному адресу.

РЕДАКТИРОВАТЬ: Как кто-то еще заметил, std::string следует использовать с std::cin вместо C-строки char*, так как он не требует выделения памяти и является гораздо более безопасным методом. Память в string автоматически выделяется и управляется для вас, освобождая вас от ответственности за создание и удаление пространства для массива char.

...