我对getline +字符串的理解是什么?

Bre*_*ent 11 c++ arrays string getline

这是我第一次使用stackoverflow.我一直无法找到关于getline的所需信息.我是一个简单的工程转移编程类,所以我们编写的代码非常简单.我在这里尝试做的就是将用户定义的问题和答案放入两个不同的数组中.我的while循环看起来像这样(我正在使用for循环,但切换到只是为了看它是否会停止破坏):

int main ()
{
    srand((unsigned)time(0));
    string quest1[100], answ1[100];
    int size1, x = 0, num, count1, visit[100], shuffle[100];
    fstream flashcard1; 

    cout << "flashcard.cpp by NAME\n" << endl;
    cout << "This program allows user to manipulate questions and answers for studying.\n" << endl;
    cout << "\nHow many flash cards will be entered(MAX 100)? ";
    cin >> size1;
    cout << endl;

    while(x < size1)
    {
        cout << "Enter Question: ";
        getline(cin , quest1[x]);
        cout << endl;
        x = x++;

        /*
        cout << "Enter Answer: " << endl;
        getline(cin,answ1[x]);
        cout << endl;
        flashcard1.open("flashcard1.dat", ios::app);
        flashcard1 << quest1[x] << " " << answ1[x] << endl;
        flashcard1.close();
        cout << "Data Stored." << endl;
        */
    }
}
Run Code Online (Sandbox Code Playgroud)

我注意到输入部分的答案以及保存数据只是为了调试.当我运行程序时,它跳过第一个问题的getline,显示第二个循环"输入问题",getline适用于其余部分.因此,如果我的size1为5,则程序仅填充阵列位置1-4.请帮忙.这是一个简单的闪存卡程序,它将执行相同的操作,就像您要创建闪存卡来研究和随机播放它们一样.

Set*_*gie 13

它似乎跳过第一次迭代的原因是因为当你这样做

cin >> size1;
Run Code Online (Sandbox Code Playgroud)

输入一个数字并按Enter键.cin读取整数并将换行符留在缓冲区上,这样当你调用时getline,就好像你立即按下回车键,并且getline什么都不读(因为它在读取换行符之前停止),丢弃换行符,并放入空字符串quest1[0].这就是为什么其余getline的工作"正确".

添加cin.ignore('\n')上面的循环以消除延迟'\n',这应该使它工作,禁止代码中的其他错误.

并且不要忘记改为x = x++只是x++为了避免UB.

  • @Brent ok,然后尝试`cin.ignore(1)`.我自己尝试过它并且有效. (2认同)