我写了一个程序,要求学生的姓名和他的分数。一切都编译顺利,但在执行后,程序只要求名称,然后停止。
#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;
}
您需要分配name
(或name1
(。有很多方法可以做到这一点,但最好的方法是 a( 使用std::string
:
std::string name;
或 b( 将名称转换为数组:
char name[BUFFER_SIZE]; // BUFFER_SIZE is some constant
注意:b(可能需要一些特殊的逻辑来确保你不会超过BUFFER_SIZE
,但我会留给你来弄清楚。
在代码的这一部分中:
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
阵列创建和删除空间。