1

我有一些大学工作,我注意到 get() 不起作用,但我不知道为什么。

我尝试将 getch() 和 getchar() 放在 gets() 之前,但还有其他问题。

当我在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);
}
4

2 回答 2

2

不要使用获取

使用cin.getline()而不是gets,无论您在哪里使用gets

cin.getline(department, sizeof department);

gets已过时,因为无法指定输入大小,存在缓冲区溢出的危险。

摆脱不需要的换行符

在您的情况下,gets使用的是先前输入中的(未丢弃的)换行符,因此存储了一个空字符 *。用于cin.ignore()消除不需要的空间 - 使用时您也需要它getline()

或者,您可能总是希望以cin.getline()一致的方式读取用户输入,然后根据您期望的数据类型解析输入。这也将允许您执行更好的错误检查。

于 2013-09-30T03:19:01.687 回答
1

您正在混合 C 和 C++。当然,这是允许的,但有一种叫做惯用语言的方式。这意味着语言用户有一种以优雅的方式表达结构的自然方式。我建议更改的两个地方:

  1. 使用std::strings 代替char数组;std::string department;
  2. 利用std::getline(std::cin, department);

数组是臭名昭著的错误来源。将这种低级内存管理留给可用的标准库设施。

于 2013-09-30T03:30:41.907 回答