我有一些大学工作,因为我注意到gets()不起作用,但我无法弄清楚原因。
我尝试在get()之前放入getch()和getchar()但是还有其他错误。
当我在do-while(标记为-----> 3)之前编写实现gets()的代码时,它可以工作!!!
有人能帮助我吗?
#include<iostream>
#include<stdio.h>
#include<conio.h>
using namespace std;
class student
{
int rollNo;
char department[20];
int year;
int semester;
public:
student()
{
rollNo=0;
year=0;
semester=0;
}
void getData();
void promote();
void changeDepartment();
void display();
};
void student::changeDepartment()
{
if(rollNo!=0)
{
cout<<"\nEnter the new Department\n";
gets(department); -------------->1
}
else
{
cout<<"\nStudent not confirmed\n";
}
}
void student::getData()
{
cout<<"\nEnter the roll no\n";
cin>>rollNo;
cout<<"\nEnter the year\n";
cin>>year;
cout<<"\nEnter the semester\n";
cin>>semester;
cout<<"\nEnter the department\n";
gets(department); ----------------> 2
}
void student::promote()
{
if(rollNo!=0)
{
semester+=1;
if(semester%2==1)
{
year+=1;
}
}
else
{
cout<<"\nStudent not confirmed\n";
}
}
void student::display()
{
if(rollNo!=0)
{
cout<<"\nRoll No : "<<rollNo;
cout<<"\nYear : "<<year;
cout<<"\nSemester : "<<semester;
cout<<"\nDepartment : "<<department;
}
else
{
cout<<"\nStudent not confirmed";
}
}
int main()
{
student s;
int ch;
char choice;
----------------> 3
do
{
cout<<"\nMain Menu";
cout<<"\n1. Enter student details";
cout<<"\n2. Change department of student ";
cout<<"\n3. Promote student ";
cout<<"\n4. Display student details ";
cout<<"\nEnter your choice ";
cin>>ch;
switch(ch)
{
case 1 : s.getData();
s.display();
break;
case 2 : s.changeDepartment();
s.display();
break;
case 3 : s.promote();
s.display();
break;
case 4 : s.display();
break;
}
cout<<"\nDo you want to continue? (Y/n)\n";
cin>>choice;
}while((choice=='y')||(choice=='Y'));
return(0);
}
答案 0 :(得分:2)
请勿使用获取
使用cin.getline()
代替gets
,无论您在哪里使用gets
。
cin.getline(department, sizeof department);
gets
is outdated,因为无法指定输入大小,因此存在缓冲区溢出的危险。
摆脱不需要的换行
在你的情况下,gets
使用了前一个输入中的(未被删除的)换行符,因此存储了一个空的char *。使用cin.ignore()
删除不需要的空格 - 使用getline()
时也需要这样做。
或者,您可能始终希望使用cin.getline()
以一致的方式阅读用户输入,然后parse the input depending on the type of data you're expecting。这也可以让您执行更好的错误检查。
答案 1 :(得分:0)
你正在混合使用C和C ++。当然,这是允许的,但有一种称为使用语言的惯用方式;意思是语言用户有一种以优雅的方式表达结构的自然方式。我建议改变的两个地方:
std::string
代替char
数组; std::string department;
std::getline(std::cin, department);
阵列因臭虫来源丰富而臭名昭着。将这种低级内存管理留给可用的标准库设施。