C++ get()不接受输入

C++ get()不接受输入,c++,gets,C++,Gets,我有一些大学作业,我注意到gets()不起作用,但我不知道为什么 我试着将getch()和getchar()放在get()之前,但还有其他错误 当我在do while(标记为------>3)之前编写实现gets()的代码时,它可以工作 有人能帮我吗 #include<iostream> #include<stdio.h> #include<conio.h> using namespace std; class student { int rollN

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

我试着将getch()和getchar()放在get()之前,但还有其他错误

当我在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);
}
#包括
#包括
#包括
使用名称空间std;
班级学生
{
int-rollNo;
查部[20];
国际年;
学期内;
公众:
学生()
{
rollNo=0;
年份=0;
学期=0;
}
void getData();
无效提升();
无效更改部门();
void display();
};
无效学生::变更系()
{
如果(rollNo!=0)
{

cout不要使用gets

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

cin.getline(department, sizeof department);
,因为无法指定输入大小,存在缓冲区溢出的危险

删除不需要的换行符

在您的例子中,
gets
使用了来自上一个输入的(未分区的)换行符,因此存储了一个空字符*。使用
cin.ignore()
清除不需要的空格-在使用
getline()
时也需要这个


或者,您可能总是希望使用
cin.getline()以一致的方式读取用户输入,然后,这也允许你执行更好的错误检查。

< P>你混合C和C++。当然,它是允许的,但是有一种东西叫做使用语言的习惯用法;意思是用户有一种自然的方式来优雅地表达结构。在这里,我建议改变:

  • 使用
    std::string
    s代替
    char
    数组;
    std::string部门;
  • 使用
    std::getline(std::cin,department);

  • 数组是臭名昭著的大量错误源。将如此低级的内存管理留给可用的标准库设施。

    为什么要混合
    cin
    get
    get
    是一个过时的C函数。为什么要混合
    cin
    get
    ?为了您自己的利益,永远不要使用
    getde>。那么我应该使用什么来获取可以有空格的字符串呢?您可以使用
    cin.getline()
    ,但我在它之前也使用了getchar()和getch()来测试是否是这样,但仍然没有更改?要丢弃空格,可以在使用
    cin
    读取输入后立即调用
    cin.ignore()
    。(我不知道为什么
    getchar()
    对你不起作用-它在gcc中对我起作用)。@legends2k:谢谢你的评论-我在我的答案中添加了一个编辑。同意,我认为它已经完成了(评论和河马的答案)却越来越失败了是的,我本来可以加上的。但我认为推荐关于弦的OP会让他完全摆脱旧习惯。这个解释对我来说特别直观。谢谢!