gets()没有输入

时间:2013-09-30 03:15:54

标签: c++ gets

我有一些大学工作,因为我注意到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);
}

2 个答案:

答案 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 ++。当然,这是允许的,但有一种称为使用语言的惯用方式;意思是语言用户有一种以优雅的方式表达结构的自然方式。我建议改变的两个地方:

  1. 使用std::string代替char数组; std::string department;
  2. 使用std::getline(std::cin, department);
  3. 阵列因臭虫来源丰富而臭名昭着。将这种低级内存管理留给可用的标准库设施。