为什么 getline() 函数不起作用,除非我在函数 charmodifier 中调用它两次

why does the getline() function does not work unless I call it twice in the function charmodifier

怎么了 如果我在字符修饰符函数中只使用一次 get line 函数,编译器将忽略它 除非我两次调用该函数 为什么我不能只使用一次? 我尝试使用其他方式,它有效但我想了解这个 我现在只是随便写一些东西,这样添加更多详细信息错误消息就会消失

#include <iostream>
#include<string>
using namespace std;
class egybest
{
    string link,m;
    char sys, type, restart;
    int s = 1, e = 1, date;
public:
    string charmodifier()
    {
       //here
        getline(cin, m);
        getline(cin, m);
        for (int x = 0; x <= m.size(); x++)
        {
            if (m[x] == ' ')
                m[x] = '-';
        }
        return m;
    }
    ~egybest()
    {
        system("cls");
        cout << "do you want to restart the program? y:n;" << endl;
        cin >> restart;
        system("cls");
        if (restart == 'y' || restart == 'Y')
            egybest();
        else if (restart == 'n' || restart == 'N')
        {
            system("exit");
        }
    }
    egybest()
    {
        cout << "do you want to watch a movie or a series? 1:2;" << endl;
        cin >> type;
        system("cls");
        if (type == '1')
            linkmovie();
        else if (type == '2')
            series();
        else
            cout << "wrong input!" << endl;
    }
    void linkmovie()
    {
        cout << "enter the name of the movie:" << endl;
        charmodifier();
        cout << "enter the release date: " << endl;
        cin >> date;
        link = "start https://cape.egybest.cool/movie/" + m + "-" + to_string(date);
        cout << endl;
        system(link.c_str());
    }
    void series()
    {
        cout << "do you want it to open links for a particular season, particular episode or all seasons? s:e:a;"
            << endl;
        cin >> sys;
        system("cls");
        if (sys == 'S' || sys == 's')
            linkseason();
        else if (sys == 'A' || sys == 'a')
            linkall();
        else if (sys == 'E' || sys == 'e')
            linkepisode();
        else
            cout << "wrong input!" << endl;
    }
    void linkall()
    {
        cout << "season No." << endl;
        cin >> s;
        cout << "episode No." << endl;
        cin >> e;
        cout << "enter the name of the show:" << endl;
        charmodifier();
        for (int j = 1; j <= s; j++)
        {
            for (int i = 1; i <= e; i++)
            {
                link = "start https://cape.egybest.cool/episode/" + m + "-season-" + to_string(j) + "-ep-" + to_string(i);
                system(link.c_str());
            }
        }
        cout << endl;
    }
    void linkepisode()
    {
        cout << "season No." << endl;
        cin >> s;
        cout << "episode No." << endl;
        cin >> e;
        cout << "enter the name of the show:" << endl;
        charmodifier();
        link = "start https://cape.egybest.cool/episode/" + m + "-season-" + to_string(s) + "-ep-" + to_string(e);
        cout << endl;
        system(link.c_str());
    }
    void linkseason()
    {
        cout << "season No." << endl;
        cin >> s;
        cout << "episodes No." << endl;
        cin >> e;
        cout << "enter the name of the show:" << endl;
        charmodifier();
        for (int i = 1; i <= e; i++)
        {
            link = "start https://cape.egybest.cool/episode/" + m + "-season-" + to_string(s) + "-ep-" + to_string(i);
            cout << endl;
            system(link.c_str());
        }
    }
};
int main()
{
    egybest egy;
    return 0;
}```

问题是在输入整数或字符后,例如

cout << "episode No." << endl;
cin >> e;
cout << "enter the name of the show:" << endl;
charmodifier();
//...

输入缓冲区包含对应于按下的 Enter 键的换行符 '\n'

因此下面的 getline 调用读取一个空字符串,直到遇到换行符。

在这种情况下,在调用 getline 之前,您需要从输入缓冲区中删除换行符,例如

#include <limits>

//...

cout << "episode No." << endl;
cin >> e;
cout << "enter the name of the show:" << endl;
std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
charmodifier();
//...