程序在C++中输入char变量后结束

程序在C++中输入char变量后结束,c++,char,C++,Char,我写了一个程序,要求输入一个学生的名字和分数。一切编译都很顺利,但在执行之后,程序只要求输入名称,然后停止 #include <iostream> int main(){ class student{ public : char *name; int marks1; int marks2; student(char* n, int n1, int n2){ name=n, marks1

我写了一个程序,要求输入一个学生的名字和分数。一切编译都很顺利,但在执行之后,程序只要求输入名称,然后停止

#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;
}
您需要根据需要分配名称或名称1

有很多方法可以做到这一点,但最好的方法是使用std::string:

或b将名称转换为数组:

char name[BUFFER_SIZE]; // BUFFER_SIZE is some constant
注意:b可能需要一些特殊的逻辑来确保您不会超过缓冲区大小,但我将让您自己来确定。

您需要根据实际情况分配名称或名称1

有很多方法可以做到这一点,但最好的方法是使用std::string:

或b将名称转换为数组:

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

注意:b可能需要一些特殊的逻辑来确保不超过缓冲区大小,但我将让您自己来确定。

在代码的这一部分:

char *name1;
std::cout<<"Enter the student's name > ";
std::cin>>name1;
现在,name1有一块连续内存,您可以在其中放置多达50个字符值。new将分配该空间,然后为name1提供该空间所在的地址

当您尝试将数据分配给未定义的地址时,由于未定义的行为,您的程序正在崩溃


编辑:正如其他人所指出的,std::string应该与std::cin一起使用,而不是C-string char*,因为它不需要内存分配,是一种更安全的方法。字符串中的内存将自动为您分配和管理,使您无需为字符数组创建和删除空间。

在代码的这一部分:

char *name1;
std::cout<<"Enter the student's name > ";
std::cin>>name1;
现在,name1有一块连续内存,您可以在其中放置多达50个字符值。new将分配该空间,然后为name1提供该空间所在的地址

当您尝试将数据分配给未定义的地址时,由于未定义的行为,您的程序正在崩溃


编辑:正如其他人所指出的,std::string应该与std::cin一起使用,而不是C-string char*,因为它不需要内存分配,是一种更安全的方法。字符串中的内存将自动为您分配和管理,使您无需为字符数组创建和删除空间。

name1尚未分配。cin>>名称1正在向giggleweeds发送数据。附带问题:您的类声明通常不应该在函数定义中。我不知道为什么我的头脑里不允许C++,但是即使是这样,它也至少不是一个好的实践。我和CHIPSER在一起。我可以想到在函数中定义类是个好主意的一些情况,但这不是其中之一。Hibou,这个类现在只在main中可见。这使得用简单的函数构建块来构建程序变得更加困难,因为所有需要student的功能现在都必须在main中实现。这将导致在调试和维护生产代码时出现问题。尚未分配name1。cin>>名称1正在向giggleweeds发送数据。附带问题:您的类声明通常不应该在函数定义中。我不知道为什么我的头脑里不允许C++,但是即使是这样,它也至少不是一个好的实践。我和CHIPSER在一起。我可以想到在函数中定义类是个好主意的一些情况,但这不是其中之一。Hibou,这个类现在只在main中可见。这使得用简单的函数构建块来构建程序变得更加困难,因为所有需要student的功能现在都必须在main中实现。这将导致调试和维护生产代码时出现问题。这里不需要非托管动态分配。应该使用std::string或自动分配的数组。在这种情况下,询问者了解他们的解决方案不起作用的原因比得到一个简单的解决方案更有益。我将添加一个注释,以使用std::string实现最佳实践。这有点超出了易用性。你把一个不必要的内存管理负担推给了询问者,这让这变得不必要的困难。内存管理的艺术包括知道何时何地动态分配。您的示例解决的问题可以通过一个简单的自动分配数组来解决,因为大小在编译时是已知的。不需要新的。谢谢,它非常有用:这里不需要非托管动态分配。应该使用std::string或自动分配的数组。在这种情况下,询问者了解他们的解决方案不起作用的原因比得到一个简单的解决方案更有益。我将添加一个注释,以使用std::string实现最佳实践。这有点超出了易用性。你把一个不必要的内存管理负担推给了询问者,这让这变得不必要的困难。内存管理的艺术包括知道何时何地动态分配。您的示例解决的问题可以通过一个简单的自动分配数组来解决
因为大小在编译时是已知的。不需要新的。谢谢你,它非常有用:@Hibou不客气。如果这解决了您的问题,您可以通过单击旁边的复选标记来接受此答案。或者,你可以接受另一个更好的答案。@Hibou不客气。如果这解决了您的问题,您可以通过单击旁边的复选标记来接受此答案。或者,你可以接受另一个更好的答案。