【问题标题】:Avoid ignore() after whitespace-delimited-input?在空格分隔输入之后避免忽略()?
【发布时间】:2023-03-10 07:35:01
【问题描述】:
  1. 如何在空格分隔输入后显示剩余字符?或者,如果问错了,我怎么知道他们躲在那里并且需要被忽略?

  2. 我必须怎么做才能避免使用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


【解决方案1】:

std::cin&gt;&gt;previousVar 不会提取它读取的int 之后的字符,其中包括换行符。所以如果你不使用std::cin.ignore,std::getline (cin, name) 会因为这个换行符而立即结束。

为避免std::cin.ignore,您可以在第一次读取时使用std::getline,这将提取换行符:

std::string previousVarStr;
std::cout << "\n\tWhat value should previousVar be?:\t";
std::cin >> previousVarStr;
auto previousVar = std::stoi(previousVarStr); // or (in C++17) use std::from_chars if you care about the performance

或在第二次读取时使用&gt;&gt;,这将忽略前导空格:

std::string name;
std::cout << "Please, enter your full name: ";
std::cin >> name;
std::cout << "Hello, " << name << "!\n";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 2015-08-17
    • 1970-01-01
    • 2012-02-17
    相关资源
    最近更新 更多