我对getline和字符串有什么理解不足之处?

11

这是我第一次使用stackoverflow。关于getline,我一直找不到需要的信息。我在一个简单的工程转学编程课上学习,所以我们编写的代码非常简单。我所要做的就是将用户定义的问题和答案放入两个不同的数组中。我的while循环看起来像这样(我之前用for循环,但转为while只是想看看它是否会停止崩溃):

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正常工作。所以如果我有一个大小为5的size1,程序只会填充数组位置1-4。请帮帮我。

这是一个简单的闪卡程序,它可以像创建闪卡一样进行学习并随机洗牌。


7
x = x++; 是未定义行为。正确的应该是 x++(或者 ++x, x += 1, x = x + 1, x -= -1 等等)。 - Seth Carnegie
这是因为 x++ 和 ++x 都会通过增加/减少 1 来改变 x 的值。但你无法保证赋值操作发生在增量或减量之前或之后,所以 x 可能会在增量发生之前或之后被赋予 x++ 的值(标准没有指定这一点)。 - John Humphreys
4
在 SO 上提出一篇好的首个问题,点赞 +1。 - John Dibling
欢迎来到Stack Overflow!+1!虽然这与你的问题无关,但请不要在想要使用'\n'时使用endlstd::cout << std::endl 等效于 std::cout << '\n' << std::flush。另外,永远不要使用"using namespace std;",即使(尤其是)你的书本或教授告诉你要这样做。导入整个std命名空间可能会产生难以识别的错误。 - Robᵩ
@Rob 我认为关于 using namespace std; 的说法有些夸张了。只要你知道其中的危险,你可以在非常受控制的环境中使用它(例如单文件短程序)。 - Seth Carnegie
1
@大家谢谢你们的所有建议。我下个学期将上我的第一门计算机科学课程。这个简单的C++工程课是我第一次接触编程,我真的很喜欢它。如果我喜欢下个学期的CS课程,我将会选择计算机科学作为我的专业。关于Rob所说的我的代码,我甚至不知道std::cout是什么意思。我认为这位老师对C++并不是很擅长,或者他只是想让这门课尽可能简单。对于课程,他只给我们PPT文件,每节课教我们2-5个新的C++代码。无论如何,感谢大家的帮助! - Brent
1个回答

13
原因是它似乎跳过了第一次迭代,这是因为当你执行以下操作时:
cin >> size1;

您输入一个数字并按下回车键。cin读取整数并将未读的换行符留在缓冲区中,因此当您调用getline时,就好像立即按下了回车键,getline什么也不读取(因为它在读取换行符之前停止),丢弃换行符,并将空字符串放入quest1[0]。这就是为什么其余的getline可以正常工作的原因。

在您的循环上方添加cin.ignore('\n')以清除残留的'\n',这样应该可以解决问题,除非代码中存在其他错误。

别忘了将x = x++更改为x++以避免UB。


谢谢!我多年来没有遇到过如此乐于助人的社区! - Brent
@Brent 如果这个回答解决了你的问题,请确保点击旁边的复选标记,将其标记为你问题的答案。 - Seth Carnegie
抱歉,我之前在上课,无法编辑我的程序,但是我认为这是正确的答案。当我在循环上方添加了cin.ignore('n')时,程序就永远不会在循环内部呈现第一个cout语句,除非你按下回车键大约六次。 - Brent
2
@Brent 好的,那就试试 cin.ignore(1)。我自己尝试了一下,它有效。 - Seth Carnegie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接