我对 getline+strings 有啥不了解的地方?
Posted
技术标签:
【中文标题】我对 getline+strings 有啥不了解的地方?【英文标题】:What am I not understanding about getline+strings?我对 getline+strings 有什么不了解的地方? 【发布时间】:2012-01-05 02:27:07 【问题描述】:这是我第一次使用 ***。我一直无法找到我需要的有关 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 对其余问题有效。因此,如果我的 size1 为 5,则程序仅填充数组位置 1-4。请帮忙。 这是一个简单的闪存卡程序,它的作用与创建闪存卡来学习和洗牌一样。
【问题讨论】:
x = x++;
是未定义的行为。它应该只是x++
(或++x
,或x += 1
,或x = x + 1
,或x -= -1
....)
那是因为 x++ 和 ++x 都通过将 x 的值减 1 来改变 x 本身。但您不能保证赋值发生在此之前或之后,因此可以为 x 赋值x++ 在增量发生之前或之后发生(标准只是没有指定这一点)。
+1 表示关于 SO 的第一个问题。
欢迎来到 Stack Overflow。 +1!这与您的问题无关,但是 1) 当您的意思是 '\n'
时,请不要使用 endl
。 std::cout << std::endl
完全等同于 std::cout << '\n' << std::flush
。 2)永远不要说“使用命名空间std;”,即使(特别是如果)你的书或教授告诉你。将整个 std
命名空间导入程序会产生难以识别的错误。
@all 感谢所有提示。下学期我要上第一堂计算机科学课。这个简单的 C++ 工程课程是我第一次涉足编程,我真的很喜欢它。如果我喜欢下学期的 CS 课,我将主修计算机科学。就我的代码而言,关于 Rob 所说的话。我什至不知道 std::cout 做了什么。我不认为这位老师对C++很擅长,或者他只是想让课堂尽可能简单。对于课程,他只是给我们提供了 ppt 文件,每节课教我们 2-5 个新的 C++ 代码。无论如何感谢所有帮助家伙!
【参考方案1】:
它似乎跳过第一次迭代的原因是因为当你这样做时
cin >> size1;
您输入一个数字并按 Enter 键。 cin
读取整数并将换行符留在缓冲区中未读取,因此当您调用getline
时,就好像您立即按下回车键,而getline
什么也不读取(因为它在读取换行符之前停止),丢弃换行符,并将空字符串放入quest1[0]
。这就是为什么 getline
s 的其余部分“正常”工作的原因。
在循环上方添加cin.ignore('\n')
以消除挥之不去的'\n'
,这样它应该可以工作,除非代码中出现其他错误。
不要忘记将 x = x++
更改为 x++
以避免 UB。
【讨论】:
谢谢!多年来我从未体验过如此有帮助的社区! @Brent 如果这回答了您的问题,请确保单击它旁边的复选标记以将其标记为您问题的答案。 我很抱歉。我早些时候在课堂上,无法编辑我的程序,但认为这是正确的答案。当我在循环上方添加 cin.ignore('n) 时,程序永远不会在循环中显示第一个 cout 语句,除非你只是按了大约六次回车 @Brent 好的,然后试试cin.ignore(1)
。我自己试过了,效果很好。以上是关于我对 getline+strings 有啥不了解的地方?的主要内容,如果未能解决你的问题,请参考以下文章