【发布时间】:2023-03-10 07:35:01
【问题描述】:
-
如何在空格分隔输入后显示剩余字符?或者,如果问错了,我怎么知道他们躲在那里并且需要被忽略?
-
我必须怎么做才能避免使用
cin.ignore()?我试图学习如何使用get()和getline()。似乎它们只有在我首先使用cin.ignore()时才有效,这对我来说似乎有点低效。
我的代码提示我输入一个数字,看起来很像这样:
int previousVar;
std::cout<<"\n\tWhat value should previousVar be?:\t";
std::cin>>previousVar;
紧接着,我添加了这段代码(从 cpp 参考网站复制粘贴):
std::string name;
//std::cin.ignore();
std::cout << "Please, enter your full name: ";
std::getline (cin, name);
std::cout << "Hello, " << name << "!\n";
cin>>beforeExit;
除非我有cin.ignore(),否则我的代码会完全跳过名称收集部分,直到我的程序结束暂停。我在其中一个 cpp 参考页面上读到,我可能有来自先前 cin 输入的剩余字符。我在 http://www.cplusplus.com/forum/beginner/111268/ 和 difference between cin.get() and cin.getline() 看到了类似的问题,但我不确定他们问的问题和我一样。
【问题讨论】:
-
在你的情况下“避免”
ignore的唯一方法是,如果你实现ignore函数的作用:在循环中一个接一个地读取字符,直到你到达例如新队。最好打电话给ignore,它已经可以满足您的需求了。 -
@Someprogrammerdude 那么任何时候我在 'cin' 之后使用 'getline()' 时都可能需要 'ignore()' 吗?某种“cout”或带有“endl”的东西会起作用吗?不是我想绕过使用 'ignore()',而是我想了解代码发生了什么,所以我知道我为什么要使用它。
-
cin和cout对象是不同的对象,它们有自己的语义,更重要的是它们自己的缓冲区。cin和cout之间的唯一联系是导致在对cin进行任何输入之前刷新cout的“领带”。 -
至于
ignore的工作原理,基本上就是我在第一条评论中所说的方式:它循环,从输入流中逐字符读取,直到满足结束条件(它已读取指定的字符数,或者它已经读取了终止符)。它读取的所有字符都会丢弃,忽略它们。该函数是必需的,因为终端将从键盘读取的所有字符发送到您的程序,包括回车键的换行符,而换行符是getline默认查找的内容。
标签: c++ get whitespace getline