问题 我对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;
        */
    }
}

我注意到输入部分的答案以及保存数据只是为了调试。当我运行程序时,它跳过第一个问题的getline,显示第二个循环“输入问题”,getline适用于其余的。因此,如果我的size1为5,则程序仅填充阵列位置1-4。请帮忙。 这是一个简单的闪存卡程序,可以像创建闪存卡一样研究和改组它们。


12919
2017-11-23 19:51


起源

x = x++; 是未定义的行为。它应该是 x++ (要么 ++x, 要么 x += 1, 要么 x = x + 1, 要么 x -= -1....) - Seth Carnegie
这是因为x ++和++ x都通过将其值减1或减1来改变x本身。但是不能保证赋值在此之前或之后发生,因此x可以在增量发生之前或之后赋值x ++它发生了(标准只是没有指定)。 - John Humphreys - w00te
关于SO的第一个问题的+1。 - John Dibling
欢迎使用Stack Overflow。 +1!这是你的问题的主题,但1)请不要使用 endl 当你的意思 '\n'。 std::cout << std::endl 恰恰相当于 std::cout << '\n' << std::flush。 2)永远不要说“使用命名空间std;”,即使(特别是如果)你的书或教授告诉你。导入整个 std 命名空间进入程序会产生难以识别的错误。 - Robᵩ
@all感谢所有的提示。下个学期我正在上我的第一个计算机科学课。这个简单的工程C ++课程是我第一次深入编程,我非常喜欢它。如果我喜欢下学期的CS课程,我将继续攻读计算机科学专业。至于我的代码是关于Rob所说的。我甚至都不知道std :: cout是做什么的。我不认为这位老师对C ++非常擅长,或者他只是想让课程尽可能简单。对于课程,他只是给我们ppt文件,它们教我们每班2-5个新的C ++代码。无论如何感谢所有的帮助家伙! - Brent


答案:


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

cin >> size1;

输入一个数字并按Enter键。 cin 读取整数 并将新行字符保留在缓冲区中,所以当你打电话 getline,就好像你立即按下回车键,然后 getline 什么都不读(因为它在读取换行符之前停止),丢弃换行符,并将空字符串放入 quest1[0]。这就是为什么剩下的了 getline工作“正确”。

cin.ignore('\n') 在你的循环之上摆脱挥之不去 '\n',这应该使它工作,禁止你的代码中的其他错误。

不要忘记改变 x = x++ 到了 x++ 避免UB。


13
2017-11-23 19:55



谢谢!多年来我没有经历过这样一个有用的社区! - Brent
@Brent如果这回答了您的问题,请务必点击它旁边的复选标记,将其标记为您问题的答案。 - Seth Carnegie
我道歉。我之前在课堂上无法编辑我的程序,但认为这是正确的答案。当我将cin.ignore('n)添加到我的循环之上时,程序只是永远不会在循环中调出第一个cout语句,无论你只是输入大约六次 - Brent
@Brent确定,然后试试 cin.ignore(1)。我自己尝试过它并且有效。 - Seth Carnegie
谢谢!这非常有效。 - Brent